Mạng máy tính là hệ thống các máy tính độc lập (autonomous) được kết nối
với nhau. Khái niệm độc lập ở đây có nghĩa là chúng không có mối quan hệ
chủ/tớ (master/slave) rõ ràng. Hai máy tính được gọi là được kết nối với nhau
nếu chúng có khả năng trao đổi thông tin. Sự kết nối có thể thông qua dây
dẫn, tia laser, sóng điện từ hay vệ tinh viễn thông.
104 trang |
Chia sẻ: phuongt97 | Lượt xem: 526 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Tài liệu Kiến thức mạng cơ bản, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ấp
địa chỉ người nhận.
int sendto(int sock, char * buff, int len, int flag, struct sockaddr * destaddr,
int addrlen)
Bốn tham số đầu giống như bốn tham số của send().
Hai tham số sau là địa chỉ của người nhận và độ dài của địa chỉ.
Do sendto() có quá nhiều tham số, lập trình viên có thể sử dụng lời gọi
sendmsg()
int sendmsg(int sock, struct msghdr msg[], int flag)
Với tham số msg là một cấu trúc có chứa địa chỉ và danh sách nhiều đoạn dữ
liệu cần gửi đi.
I.3.5. Một số lời gọi nhận dữ liệu từ socket
Tương ứng với 5 lệnh để gửi dữ liệu có 5 lệnh dùng để nhận dữ liệu với tham
số và cơ chế hoàn toàn giống nhau.
int recv(int sock, char * buff, int len, int flag)
int read(int fd, char * buff, int len)
int readv(int fd, struct iovec iovector[], int * vectorlen)
int recvfrom(int sock, char * buff, int len, int flag, struct sockaddr *
destaddr, int *addrlen)
int recvmsg(int sock, struct msghdr msg[], int flag)
70
II. MÔ HÌNH CLIENT-SERVER
Theo cách nhìn của người lập trình, TCP/IP giống như hầu hết các giao thức
truyền thông khác cung cấp cơ chế cơ bản để truyền dữ liệu. Đặc biệt, TCP/IP
cho phép người lập trình thiết lập truyền thông giữa hai chương trình ứng
dụng và truyền dữ liệu qua lại. TCP/IP cung cấp kết nối bình đẳng giữa các
ứng dụng kể cả các ứng dụng chạy trên cùng một máy.
Một phát triển của mô hình peer-to-peer là mô hình Client-Server đã trở thành
mô hình cơ bản được sử dụng trên mạng máy tính. Chương trình Server là
một chương trình chờ đợi kết nối từ chương trình Client và cung cấp dịch vụ
cho Client.
Mô hình được mô tả như sau:
Tiến trình Server được khởi động trên một hệ thống nào đó sau đó chờ đợi
một tiến trình Client kết nối đến yêu cầu dịch vụ.
Tiến trình Client được khởi động trên cùng hệ thống máy với chương trình
Server hoặc từ một hệ thống khác kết nối với hệ thống chủ thông qua
mạng. Client gửi yêu cầu qua mạng tới tiến trình Server đòi hỏi một số
dịch vụ như:
Trả lại ngày giờ cho Client
In một file cho Client
Đọc hoặc ghi file vào hệ thống file của Server
Cho phép Client login vào hệ thống Server
Chạy chương trình của Client trên hệ thống Server
Sau khi cung cấp dịch vụ cho Client, Server tiếp tục nghỉ và chờ đợi kết
nối khác.
Chúng ta có thể chia tiến trình Server làm 2 kiểu:
Tương tác (Interative Server): Khi Client đòi hỏi những dịch vụ đã đăng
ký trước với khoảng thời gian thực hiện nhỏ, Server tự làm công việc đó ví
dụ dịch vụ trả lại ngày giờ.
71
Đồng thời (Concurrent Server): Với những yêu cầu đòi hỏi thời gian thực
hiện lớn, tiến trình Server sinh một tiến trình con để thực hiện yêu cầu còn
nó tiếp tục chờ đợi yêu cầu khác. Dịch vụ in file, đọc-ghi file được thực
hiện theo kiểu này.
II.1. Mô hình Client-Server sử dụng dịch vụ không kết nối
Với mô hình không kết nối, client không kết nối với server mà chỉ gửi dữ liệu
đến sử dụng lời gọi sento(), ngược lại, server sử dụng lời gọi recvfrom() chờ
đợi dữ liệu từ client chuyển đến. Lời gọi recvfrom() trả lại địa chỉ của client,
nhờ đó server có thể gửi kết quả lại cho client.
recvfrom()
recvfrom()
bind()
bind()
socket()
sendto()
Server
(connectionless protocol)
block until data received
from client
process request
sendto()
socket()
Client
data (reply)
data (request)
Lời gọi socket cho mô hình client-server không kết nối
72
II.2. Mô hình Client-Server sử dụng dịch vụ hướng kết nối
Với mô hình Client-Server sử dụng dịch vụ hướng kết nối, đầu tiên Server
được khởi động và chờ đợi một kết nối từ client.
Sau khi kết nối được thiết lập, hai bên luân phiên nhau gửi nhận dữ liệu thông
qua đường truyền.
accept()
listen()
bind()
socket()
write()
write()
Server
(connection-oriented protocol)
Connect()
read()
read()
socket()
block until connection from
client
Process request
Connection establishment
data (reply)
data (request)
Client
Lời gọi socket cho mô hình client-server hướng kết nối
73
III. XÂY DỰNG CHƯƠNG TRÌNH TRUYỀN TỆP
III.1. Thiết kế và cài đặt chương trình
III.1.1. Giao thức ứng dụng được xây dựng và sử dụng trong chương
trình
Bản thân giao thức TCP là một giao thức hướng kết nối và đáng tin cậy, giao
thức này đảm bảo dữ liệu truyền vào socket đầy đủ, nhưng để tăng cường tính
tin cậy của chương trình ứng dụng và để kiểm soát việc truyền dữ liệu nhất là
trên các mạng có độ trễ lớn hay những mạng thường xuyên xảy ra hiện tượng
quá tải, một giao thức ứng dụng riêng được xây dựng cho chương trình.
Gói tin của giao thức ứng dụng được mô tả như sau:
0 1 2 Dữ liệu tối đa 4094 byte
Size Data
Size dài 2 byte chứa độ dài của phần dữ liệu của gói tin.
Data chứa dữ liệu, trường này có độ dài tối đa là 4094 byte vì giao thức
sử dụng gói tin dài tối đa 4096 byte.
Việc sử dụng các kết nối:
Chương trình sử dụng hai kết nối, một để truyền lệnh và một để truyền dữ liệu
giữa client và server.
Kênh truyền điều khiển dùng để truyền các lệnh và các thông báo có tính
chất điều khiển, điều này làm giảm tính phức tạp trong việc phân tích và
xử lý các lệnh của chương trình.
Kênh truyền dữ liệu được thiết lập ngay trong quá trình tạo kết nối giữa
tiến trình client và tiến trình server và được dùng đến mỗi khi có dữ liệu
cần truyền nhận giữa client và server. Các khối dữ liệu có thể được chia
nhỏ thành các gói tin và truyền trên kênh dữ liệu, kết thúc một khối dữ liệu
là một gói tin có độ dài bằng 0.
74
Việc sử dụng hai kênh truyền
Có 3 loại lệnh trong chương trình sử dụng các kênh truyền như sau:
Client gửi lệnh đến server và nhận về một thông báo trên kênh điều khiển
ví dụ thông báo lỗi hoặc hoàn thành lệnh.
Client gửi lệnh đến server và nhận về một thông báo có dữ liệu truyền
“Openning data port”. Khi đó, client bắt đầu nhận dữ liệu trên kênh dữ liệu
cho tới khi nhận được một gói tin có độ dài là 0.
Server Client
Gửi lệnh
Nhận lệnh và thi hành
Nhận thông
báo
Gửi thông báo hoàn thành
lệnh hoặc báo lỗi
Server Client
Gửi lệnh
Nhận lệnh và thi hành
Nhận thông
báo
Nhận dữ liệu ở kênh
dữ liệu tới khi gói
tin có độ dài là 0
Gửi thông báo có dữ liệu cần
truyền
Gửi lần lượt các gói tin kết
thúc bởi một gói có độ dài là
0
75
Client gửi lệnh yêu cầu truyền tệp lên server, server gửi lại thông báo chấp
nhận. Client ghi dữ liệu cần truyền vào kênh dữ liệu, sau khi ghi xong,
client chờ đợi một thông báo của server trên kênh điều khiển truyền lại số
lượng byte đã nhận và thông báo trên màn hình của người sử dụng. Quá
trình truyền nhận thông tin trên kênh dữ liệu cũng có thể được điều khiển
trực tiếp trên kênh điều khiển ví dụ dừng truyền.
III.1.2. Cài đặt chương trình
Chương trình truyền tệp được xây dựng dựa trên mô hình client-server sử
dụng thư viện socket, giao thức lớp dưới là giao thức hướng kết nối TCP.
Tiến trình server hoạt động theo kiểu đồng thời (concurrent), server “nghe” ở
cổng 1998, khi có một tiến trình client kết nối đến, server nhận số hiệu cổng
của client, sinh tiến trình con để phục vụ còn bản thân tiến trình cha tiếp tục
quay lại nghe. Tiến trình server phục vụ tạo một kết nối lệnh để truyền lệnh
và một kết nối dữ liệu để truyền các khối dữ liệu giữa client và server.
Server Client
Gửi yêu cầu truyền
dữ liệu Nhận lệnh
Nhận và thông báo với người
sử dụng số byte truyền
Nhận dữ liệu ở kênh
dữ liệu tới khi gói
tin có độ dài là 0
Gửi thông báo chấp nhận
Thông báo số byte đã nhận
Gửi lần lượt các gói tin kết
thúc bởi một gói có độ dài là
0
76
Phần server chạy trên các máy chủ Unix, Windows NT phục vụ cho phần
client chạy trên các máy Dos, Windows và Unix. Chương trình hoạt động gần
giống FTP nhưng có một số tính năng nâng cao:
Thực hiện lệnh từ xa với EXEC: Chương trình server nhận lệnh gửi tới từ
client, thực hiện lệnh đó và gửi trả kết quả vào kênh truyền, chương trình
client đọc và hiển thị kết quả đó trên màn hình của người sử dụng.
Thực hiện lệnh của hệ điêu hành trên máy trạm !CMD: Một số lệnh của hệ
điều hành có thể được thực hiện trên máy trạm, chúng được tiến trình
client giải quyết bằng cách gọi chương trình thông dịch của hệ điều hành.
Khả năng thay đổi kích thước bộ đệm với BUFSIZ kích thước của bộ đệm
có thể được thay đổi bằng cách thay đổi biến môi trường chứa kích thước
bộ đệm. Việc này làm tăng năng suất của việc truyền thông tin trên mạng.
Một số thao tác với thư mục trên máy chủ như tạo thư mục, xoá thư mục
được thực hiện bằng cách gọi các lệnh của hệ điều hành Unix hoặc những
hàm mức thấp trong thư viện của C.
Chương trình còn cung cấp một số lệnh làm việc trực tiếp với tệp như
OPEN, LSEEK, READ, WRITE... những lệnh này sử dụng thư những
lời gọi mức thấp của hệ thống.
Sau đây là những lệnh đã cài đặt trên server
Lệnh Mô tả
EXEC command [option] Chạy một lệnh Unix
USER username [PASS password] Đăng nhập hệ thống
PASSWD password Nhập password
CHPWD newpassword Đổi password
PORT portnumber Đăng ký một cổng truyền dữ liệu
ABORT Loại bỏ quá trình truyền
PWD Lệnh đổi thư mục
77
LIST [option] [directory] Lệnh xem thư mục
CHDIR [directory] Lệnh đổi thư mục
MKDIR directory [mode] Tạo thư mục mới
RMDIR directory Xoá thư mục
UNLINK filename Xoá tệp
OPEN path openflag [mode] Mở tệp
LSEEK fildes offset whence Chuyển con trỏ tệp
READ fildes nbytes Đọc từ tệp
WRITE fildes nbytes Ghi tệp
LOCKF fildes mode size Khoá tệp
CLOSE filedes Đóng tệp
TMPNAM [path[prefix]] Tạo một tệp tạm thời
PUT filename Truyền tệp lên máy chủ
APPEND filename Mở tệp để append
GET filename Lấy tệp từ máy chủ
HELP Trợ giúp
UNIX Hoạt động ở mode Unix
TNET Hoạt động ở mode Tnet
QUIT Thoát
UMASK [mode] Đặt mặt nạ mode cho file truyền
FMODE filename Xem mode của file
FSIZE filename Xem độ dài của file
BUFSIZ size_of_buffer Đặt lại kích thước cho bộ đệm
REXEC host user passwd command Chạy một lệnh từ xa
Phần client giao tiếp với người sử dụng, nhận lệnh, phân tích lệnh, xử lý hoặc
gửi cho server, nhận và trả kết quả lại cho người sử dụng.
(Văn bản chương trình client được in trong phần phụ lục C)
78
III.2. Một số vấn đề nảy sinh trong quá trình thực hiện và cách giải
quyết
III.2.1. Vấn đề chuyển đổi tệp giữa hai hệ điều hành.
Do khái niệm về tệp và sự quản lý truy nhập ở hai hệ điều hành DOS và
UNIX có nhiều điểm khác nhau nên sự chuyển đổi tệp giữa hai hệ điều hành
gặp phải một số vấn đề.
Các tệp tin trên DOS hoàn toàn không có các thông tin về quyền sở hữu hay
quyền truy nhập nên thông tin này sẽ bị mất khi sao chép một tệp từ máy
UNIX sang một máy DOS.
Ngoài ra một vấn đề hết sức quan trọng và cũng khó có cách giải quyết tối ưu
là vấn đề tên tệp. Tên tệp trên UNIX có thể dài tới 14 ký tự (đối với UNIX
System V) hoặc hơn nữa, các ký tự có thể là chữ in hoa, chữ thường hay các
ký tự đặc biệt đều được chấp nhận. Các thư mục trong đường dẫn của UNIX
được phân cách bởi dấu '/'. Trong khi đó tên tệp của DOS chỉ được phép dài
tối đa 8 ký tự cộng với 3 ký tự của phần mở rộng và bị hạn chế toàn bộ là chữ
in hoa không sử dụng chữ thường cùng với hàng loạt dấu và ký tự đặc biệt.
Các thư mục trong đường dẫn được phân cách bởi dấu '\'. Cho nên một ánh xạ
1-1 giữa hai loại tên tệp là không thể tồn tại. Nếu có một hàm nào đó thực
hiện được ánh xạ này thì sau khi chuyển một tệp từ máy UNIX tới máy DOS,
tên tệp đích sẽ hoàn toàn xa lạ với tên tệp nguồn gây ra khó khăn cho người
sử dụng.
Ví dụ, ta muốn có một tiện ích thực hiện việc backup một số tệp trên máy
UNIX sang máy DOS. Ta sẽ đơn giản chuyển các tệp đó sang máy DOS
nhưng khi cần chuyển các tệp này về vị trí cũ thì ta không thể xác định chính
xác vị trí cũ của tệp và không thể phục hồi lại đầy đủ tên của tệp. Nếu dùng
79
một hàm nào đó để tạo ra ánh xạ 1-1 thì khi sao chép sang máy DOS sẽ tạo ra
những tên tệp đặc biệt rất khó cho việc quản lý.
Với bài toán này UNIX có tiện ích tar giải quyết bằng cách gom tất cả các
tệp vào thành một tệp kèm theo thông tin chi tiết về tệp đó, khi cần, có thể
phục hồi lại tệp một cách chính xác. Nhưng tiện ích này không thể áp dụng
cho mọi bài toán ví dụ cần đọc và xử lý tệp dưới môi trường DOS...
Có một giải pháp tạm thời cho vấn đề này là phải cắt bỏ phần đằng sau
của tên tệp trên UNIX. Đây cũng chính là giải pháp đối với tên tệp dài của
Windows 95 khi các tệp này được truy nhập bởi DOS 6.x (hoặc các phiên
bản DOS trước). Với cách làm này chúng ta phải chú ý tới sự trùng tên sau
khi cắt bỏ phần đuôi và xử lý một số ký tự đặc biệt còn lại.
Ví dụ : Hai tệp
testdata001.dat và testdata002.dat
Có thể sẽ bị cắt thành testdata.dat và hai tệp sẽ bị trùng tên nhau, một trong
hai tệp sẽ không thể tồn tại.
Một giải pháp tương tự như trong Windows 95 sẽ được sử dụng đó là
chuyển hai tệp trên thành
testda~1.dat và testda~2.dat
Giải pháp đặt tên cho các tệp trên máy UNIX tương tự như trên máy DOS
là một giải pháp tồi. Nó không tận dụng tối đa khả năng của hệ điều hành
là tên tệp linh động hơn. Nhưng ta nhận thấy rằng phương pháp này đôi
khi cũng tỏ ra có hiệu quả đối với các ứng dụng đặc biệt. Ví dụ : phần mở
rộng 3 ký tự của tên tệp được dùng để xác định nội dung tệp được dùng
khá rộng rãi trên cả các hệ điều hành có tên tệp dài như UNIX, Windows
95...
Một giải pháp khác là việc thay thế hệ điều hành DOS bằng hệ điều hành
Windows 95. Trong Windows 95 tên tệp có thể dài hơn (tới 255 ký tự) và
có thể chứa một số ký tự mà DOS không cho phép như dấu trống, dấu
80
chấm... Việc chuyển đổi tên tệp sẽ đơn giản chỉ là xử lý một số trường hợp
các ký tự đặc biệt. Với sự phát triển hiện nay hệ điều hành DOS đang dần
bị thay thế bởi Windows 95 (không chỉ bởi đặc tính tên tệp mà bởi nhiều
tính năng vượt trội của Windows 95) thì việc thay thế này hoàn toàn thích
hợp.
III.2.2. Vấn đề về một số lệnh tương tác
Vì chương trình được xây dựng với mục đích truyền file, các giao thức được
xây dựng nhằm hướng tới sự bảo đảm tính toàn vẹn cho tệp tin. Việc chạy
ứng dụng được giao cho hệ điều hành, chương trình chỉ làm nhiệm vụ truyền
tham số dòng lệnh và nhận kết quả trả về. Vì lý do đó, một số lệnh tương tác
với người dùng (cần nhận thông tin từ bàn phím) không thể chạy được với
lệnh EXEC.
81
TÀI LIỆU THAM KHẢO
Tác giả Tên sách Nhà xuất bản Năm xuất bản
Douglas
E.Comer
Internetworking with
TCP/IP
Prentice-Hall International 1991
Andrew
S.Tanenbaum
Computer Network Prentice-Hall International 1988
W.Richard
Stevens
Unix Network
Programming
Prentice-Hall International 1991
Bill Rieken
and
Lyle Weiman
Unix Network
Application
Programming
John Wiley & Sons 1992
Nguyễn Thúc
Hải
Mạng máy tính và các
hệ thống mở
Nhà xuất bản Giáo Dục 1997
Một số tài liệu kỹ
thuật của CSE
82
Phụ lục A MỘT SỐ KỸ THUẬT MẠNG CỤC BỘ
I. MẠNG ETHERNET VÀ IEEE 802.3
Ethernet và IEEE 802.3 là hai chuẩn phổ biến nhất trong kiến trúc mạng cục
bộ. Chúng sử dụng công nghệ gọi là CSMA/CD (Carrier Sense Multiple
Access/Collision Detect). Multiple Access có nghĩa là mọi máy tính và thiết
bị mạng có thể truy cập đường truyền cùng một lúc. Công nghệ Carrier Sense
cho phép các thiết bị nhận biết khi nào đường truyền đang bận. Trước khi
thiết bị truyền thông tin, nó kiểm tra đường truyền, nếu đường truyền bận, nó
đợi một khoảng thời gian ngẫu nhiên nào đó và tiếp tục. Nếu đường truyền
không bận, nó bắt đầu truyền dữ liệu của mình. Nếu 2 trạm cùng truyền thông
tin một lúc, dữ liệu có thể bị phá huỷ (collision), Collision Detection điều
khiển thiết bị collision controller gửi tín hiệu “jam signal” để báo cho mọi
thiết bị trên mạng biết điều gì đang sảy ra. Nếu gặp collision, thiết bị đợi một
khoảng thời gian ngẫu nhiên nào đó tính theo chu kỳ đồng hồ của nó ví dụ
một số thiết bị đợi trong khoảng 1 - 255 nhịp. Nếu gặp collision lần thứ hai,
nó đợi một khoảng trong 1 - 511. Nếu tiếp tục gặp collision, thiết bị cố gắng
thêm 6 lần. Thời gian truyền thông tin trên mạng Ethernet không thể xác định
được chính xác vì không ai có thể chắc rằng gói thông tin không bị collision.
Do vậy, thường người ta không dùng Ethernet với các ứng dụng thời gian
thực. Một đặc tính của mạng Ethernet nữa là nó không có cơ chế báo nhận,
khi sử dụng với TCP/IP dịch vụ này được tầng transport (TCP) cung cấp.
II. MẠNG TOKEN-PASING RINGS (IEEE 802.5)
Tolen-Pasing Rings cũng là một công nghệ mạng cục bộ phổ biến, việc điều
khiển lưu thông trên mạng này được sử dụng bởi một cơ chế gọi là thẻ bài
83
“token”. Token là một gói tin được chuyển vòng quanh mạng, mỗi thiết bị chỉ
được quyền truyền dữ liệu khi nó nhận được token.
84
Một đặc tính chủ yếu của Mạng Token-Pasing Rings là nó phải được nối
thành vòng, nếu một nút mạng bị lỗi, toàn bộ mạng sẽ ngừng hoạt động (đối
với mạng Ethernet chỉ một ngừng hoạt động khi nó bị lỗi). Nếu một máy bị
tắt, mạng Mạng Token-Pasing Rings vẫn cần giao diện của nó để truyền
thông, Token-ring Interface board lấy năng lượng từ cáp mạng để hoạt động.
Khi thẻ bài bị mất, sau một thời gian nào đó, một thiết bị điều khiển sẽ sinh
một thẻ bài mới.
III. MẠNG TOKEN-PASSING BUSSES (IEEE 802.4)
Token-Passing còn làm việc trên topo bus. Một chuẩn định nghĩa cho mạng
này là IEEE 802.4, là một phần của chuẩn MAP (Manufacturing Automation
Protocol). Chuẩn này sử dụng thiết bị Broadband khác với Baseband sử dụng
trong Ethernet và Token-ring. Baseband chỉ sử dụng một tín hiệu trên đường
truyền trong khi broadband sử dụng nhiều kênh truyền với các tần số tín hiệu
khác nhau trên đường truyền.
Một số mạng Broadband sử dụng hai dây dẫn, một để truyền, một để nhận dữ
liệu. Hệ thống khác lại chỉ sử dụng một dây nhưng dùng 2 tần số khác nhau
để truyền và nhận. Thông thường tần số truyên và nhận tạo thành một cặp tần
số (tính bằng MHz) để dễ chuyển đổi giữa tần số gửi và tần số nhận. Tuy sử
Token
WS
WS WS
WS
85
dụng Broadband đắt và phức tạp nhưng nó làm việc rất tốt với hình ảnh
analog và âm thanh.
Broadband
Baseband
86
Phụ lục B MỘT SỐ KỸ THUẬT CHỌN ĐƯỜNG ĐI TỐI
ƯU
Việc chọn con đường tối ưu để truyền các gói tin đi trên mạng phải thực hiện
một số công việc sau:
Quyết định chọn đường theo những tiêu chuẩn tối ưu nào đó.
Cập nhật thông tin chọn đường.
Có một số kỹ thuật chọn đường tối ưu thường được sử dụng khi xây dựng
tầng mạng
Chọn đường tập trung đặc trưng bởi sự tồn tại của một số trung tâm điều
khiển mạng thực hiện việc chọn đường sau đó gửi các bảng chọn đường
tới các nút mạng. Các nút mạng đều đặn gửi thông tin của chúng tới các
chung tâm theo một khoảng thời gian hoặc khi có một sự kiện nào đó.
Chọn đương phân tán được thực hiện tại mỗi nút của mạng. Việc này đòi
hỏi sự trao đổi thông tin thường xuyên giữa các nút.
I. GIẢI THUẬT DIJKSTRA CHO VIỆC CHỌN ĐƯỜNG TẬP
TRUNG
Giải thuật này tìm con đường có “độ dài” (chi phí) cực tiểu từ một nút nguồn
tới mỗi nút còn lại của mạng
Gọi l(i,j) là “độ dài” của đường nối trực tiếp 2 nút i và j
l(i,j) =∞ nếu không tồn tại đường nối
Nk là tập hợp tạo thành bởi k+1 phần tử (nguồn và k nút gần nguồn
nhất sau k bước thực hiện giai thuật).
Dk là “độ dài” từ nguồn tới nút n theo con đường “ngắn” nhất bao hàm
trong Nk
Thuật toán sử dụng các bước đệ quy sau:
Bước 0 (khởi động)
87
N0={1}
D0(v)=l(1,v) v ∉ N0
Bước k (tính và cập nhật)
Nk = Nk-1 ∪ {w}
trong đó w thoả mãn biểu thức
Dk-1(w) = min Dk-1(v), v ∉ Nk-1
Dk(v) = min [Dk-1(v), Dk-1(w) + l(w,v)], v ∉ Nk
Thuật toán dừng khi tất cả các nút đã nằm trong N
II. GIẢI THUẬT FORD& FULKERSON CHO VIỆC CHỌN ĐƯỜNG
PHÂN TÁN
Giải thuật này cho phép tìm tất cả các con đường “ngắn” nhất từ tất cả các nut
tới một đích chung. Sau k bước lặp, mỗi nút được đánh dấu bởi cặp giá trị
(nk(v), Dk(v))
Dk(v) là “độ dài” cực tiểu (hiện tại) từ nút v tới đích
nk(v) là nút tiếp theo (hiện tại) trên con đường “tối ưu” từ nút v tới đích, được
tính ở bước k.
Bước 0 (khởi động)
D0(1) = 0 và tất cả các nút được đánh dấu (•,∞)
Bước k (tính và cập nhật)
Với mọi v ≠ 1 (đích), cập nhật Dk(v) như sau:
Dk(v) = min [Dk-1(w) + l(v,w)]
w∈Nv
trong đó Nv là tập các nút láng giềng của v.
Cập nhật nk(v) như sau:
nk(v) = w1, với w1 thoả mãn biểu thức :
Dk-1(w1) + l(v,w1) = min [Dk-1(w) + l(v,w)]
w∈Nv
88
Thuật toán dừng khi tất cặp giá trị đánh dấu của mỗi nút giữ nguyên không
thay đổi nữa.
89
Phụ lục C VĂN BẢN CHƯƠNG TRÌNH (PHẦN CLIENT)
I. CHƯƠNG TRÌNH CHÍNH (MAIN.C)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "socket.h"
int FAR PASCAL mInitTcpIp(void);
int FAR PASCAL mMakeConnect(LPSTR host,int port);
int mMakeDataConnect(SOCKET cmd_sock);
BOOL NEAR PASCAL mReadMsg(SOCKET sock, char *recv);
BOOL NEAR PASCAL mWriteMsg(SOCKET sock, char *buf);
BOOL NEAR PASCAL mReadData(SOCKET sock, char *name);
BOOL NEAR PASCAL mWriteData(SOCKET sock, char *name);
char * GetWord(char * source, char * dest);
int CmdAnalys(char * cmd);
BOOL DoCmd(char *cmd);
BOOL GetPass(char *cmd);
BOOL GetUser(char *cmd);
BOOL Login();
BOOL PutFile(char *cmd);
BOOL GetFile(char *cmd);
BOOL DoDisconnect();
BOOL DoConnect();
struct cmd_rec {
short code;
char cmd[16];
short data_expect;
BOOL (*func)(char *cmd);
};
#define CMD_ABORT 1
#define CMD_APPEND 2
#define CMD_BUFSIZE 33
#define CMD_CHDIR 3
#define CMD_CHPWD 4
#define CMD_CLOSE 5
#define CMD_EXEC 6
#define CMD_FMODE 7
#define CMD_FSIZE 8
#define CMD_FSTAT 9
#define CMD_GET 10
#define CMD_HELP 11
#define CMD_LIST 12
#define CMD_LOCKF 13
#define CMD_LSEEK 14
#define CMD_MKDIR 15
#define CMD_OPEN 16
#define CMD_PASS 17
90
#define CMD_PORT 18
#define CMD_PUT 19
#define CMD_PWD 20
#define CMD_QUIT 21
#define CMD_READ 22
#define CMD_REXE 23
#define CMD_RMDIR 24
#define CMD_TMPNAM 25
#define CMD_TNET 26
#define CMD_UMASK 27
#define CMD_UNIX 28
#define CMD_UNLINK 29
#define CMD_USER 30
#define CMD_WRITE 31
#define CMD_HASH 35
#define CMD_DEL 36
#define CMD_LCD 37
#define CMD_LDIR 38
#define CMD_HOST 39
#define CMD_LHELP 40
#define CMD_DISCON 41
#define cmd_num 48
struct cmd_rec cmd_list[cmd_num] = {
1, "ABORT", 0, NULL,
2, "APPEND", 0, NULL,
33, "BUFSIZE", 0, NULL,
33, "BUFSIZ", 0, NULL,
3, "CHDIR", 0, NULL,
3, "CD", 0, NULL,
4, "CHPWD", 0, NULL,
5, "CLOSE", 0, NULL,
6, "EXEC", 1, NULL,
7, "FMODE", 0, NULL,
8, "FSIZE", 0, NULL,
9, "FSTAT", 0, NULL,
10, "GET", 1, NULL,
11, "H", 0, NULL,
11, "HELP", 0, NULL,
11, "?", 0, NULL,
12, "L", 1, NULL,
12, "LIST", 1, NULL,
12, "LS", 1, NULL,
13, "LOCKF", 0, NULL,
14, "LSEEK", 0, NULL,
15, "MKDIR", 0, NULL,
16, "OPEN", 0, NULL,
17, "PASS", 0, NULL,
17, "PASSWD", 0, NULL,
18, "PORT", 0, NULL,
19, "PUT", 2, NULL,
20, "PWD", 0, NULL,
21, "Q", 0, NULL,
21, "QUIT", 0, NULL,
22, "READ", 1, NULL,
23, "REXE", 1, NULL,
24, "RMDIR", 0, NULL,
25, "TMPNAM", 0, NULL,
26, "TNET", 0, NULL,
91
27, "UMASK", 0, NULL,
28, "UNIX", 0, NULL,
29, "UNLINK", 0, NULL,
30, "USER", 0, NULL,
31, "WRITE", 2, NULL,
35, "HASH", 0, NULL,
36, "DEL", 0, NULL,
37, "LCD", 0, NULL,
38, "LDIR", 0, NULL,
39, "HOST", 0, NULL,
40, "LHELP", 0, NULL,
41, "DIS", 0, NULL,
41, "DISCONNECT",0, NULL
};
int BUFF_SIZE = 1024;
int HASH = 0;
int connected = 0;
SOCKET sock, data_sock;
char cmd[DATA_LEN];
char tmp[DATA_LEN];
int port;
char host[32];
int main( int argc, char *argv[ ])
{
if ((argc 3)){
printf("Usage: %s remote_host [remote_port]", argv[0]);
return 2;
}
if (mInitTcpIp()) {
printf("Error on init\n");
return 1;
}
if (argc == 3) {
strcpy(host, argv[1]);
port = atoi(argv[2]);
} else port = 1998;
DoConnect();
do {
printf(">");
gets(cmd);
CmdAnalys(cmd);
} while (strnicmp(cmd, "q", 1) != 0);
return 0;
}
char * GetWord(char * source, char * dest)
{
int i;
char * cmdPtr = source;
i = 0;
while (*cmdPtr == ' ' && *cmdPtr != 0) cmdPtr++;
while (*cmdPtr != ' ' && *cmdPtr != 0) {
dest[i++] = *cmdPtr; cmdPtr++;
}
dest[i] = 0;
return cmdPtr;
92
}
int CmdAnalys(char * cmd)
{
int i = 0, ret = 1;
char verb[8];
char *obj;
obj = GetWord(cmd, verb);
if (verb[0] == '#') {
char *p;
p = strchr(cmd, '#') + 1;
DoCmd(p);
return 0;
}
if (verb[0] == '!') {
char *p;
p = strchr(cmd, '!') + 1;
sprintf(tmp, "command /c %s", p);
system(tmp);
return 0;
}
do {
ret = stricmp(verb, cmd_list[i++].cmd);
} while (ret && (i <= cmd_num));
if (i > cmd_num) {
printf("XXXX Unknown command\n");
} else {
i--;
switch
Các file đính kèm theo tài liệu này:
- tai_lieu_kien_thuc_mang_co_ban.pdf