Tài liệu Kiến thức mạng cơ bản

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.

pdf104 trang | Chia sẻ: phuongt97 | Lượt xem: 437 | Lượt tải: 0download
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:

  • pdftai_lieu_kien_thuc_mang_co_ban.pdf
Tài liệu liên quan