Thông tin tài liệu:
Bài này cung cấp cho người học những hiểu biết về lập trình UDP socket nâng cao với một số nội dung như: UDP hay TCP; vấn đề với UDP; lấy cờ hiệu, địa chỉ IP đích và số hiệu giao diện mạng; remind: sendmsg and recvmsg;... Mời các bạn cùng tham khảo để biết thêm các nội dung chi tiết.
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình mạng: Lập trình UDP socket nâng cao - TS. Nguyễn Hoài SơnLập trình UDP socket nâng cao TS. Nguyễn Hoài Sơn Bộ môn mạng và Truyền thông máy tính, Đại học Công nghệ, Đại học QG Hà NộiUDP hay TCP ? Gửi tin broadcast hay multicast phải dùng UDP Có thể dùng UDP với các ứng dụng với yêu cầu - trả lời đơn giản Có thể dùng UDP vỚI các ứng dụng LAN Băng thông lớn, ít lỗi Nên dùng UDP với truyền tin đa phương tiện Điều khiển luồng? Dùng TCP với việc truyền dữ liệu lớn TFTP (Trivial File Transfer Protocol) là một ngoại lệVấn đề với UDP Làm thế nào để lấy địa chỉ IP đích? Địa chỉ IP đích có thể là địa chỉ unicast hoặc địa chi multicast Làm thế nào biết và xử lý trong trường hợp gói tin UDP lớn hơn kích thước buffer? Làm thế nào để đảm bảo tính tin cậy khi đường truyền có lỗi Acknowledgement, timeout, gửi lạiLấy cờ hiệu, địa chỉ IP đích và số hiệugiao diện mạng Dùng sendmsg và recvmsg để lấy cờ hiệu từ socket các dữ liệu phụ thuộc như địa chỉ IP và số hiệu giao diện đích trong trường hợp có nhiều giao diện mạngRemind: sendmsg and recvmsg#include ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags); Both return: number of bytes read or written if OK, –1 on errorstruct msghdr { void *msg_name; /* protocol address */ socklen_t msg_namelen; /* size of protocol address */ struct iovec *msg_iov; /* scatter/gather array */ int msg_iovlen; /* # elements in msg_iov */ void *msg_control; /* ancillary data (cmsghdr struct) */ socklen_t msg_controllen; /* length of ancillary data */ int msg_flags; /* flags returned by recvmsg() */ };Remind: sendmsg and recvmsg (2) thiết lập cờ chức năng cho việc xuất nhập dữ liệu MSG_DONTROUTE: bỏ qua truy vấn bảng định tuyến MSG_DONTWAIT: không chờ khi xuất nhập dữ liệu MSG_OOB: gửi và nhận dữ liệu ngoài luồng (out-of-band) MSG_PEEK: kiểm tra dữ liệu vào nhưng vẫn giữ nguyên dữ liệu trong buffer MSG_WAITALL: đợi tất cả dữ liệu yêu cầu Cờ chức năng trả về bởi hàm recvmsg MSG_BCAST MSG_MCAST MSG_TRUNCRemind: Sau khi hàm recvmsg trả kết quảvềVí dụ: hàm recvfrom_flags ssize_t recvfromflags(int fd, void *ptr, size_t nbytes, int *flagsp, SA *sa, socklen_t *salenptr, struct unp_in_pktinfo *pktp) struct unp_in_pktinfo { struct in_addr ipi_addr; /* destination IPv4 address */ int ipi_ifindex; /* received interface index */ }; Trả về: Giá trị của msg_flags được trả về bởi hàm recvmsg Địa chỉ đích của gói tin nhận được (sử dụng tùy biến socket IP_RECVDSTADDR) Số hiệu của giao diện nhận gói tin (sử dụng tùy biến socket IP_RECVIF)Dữ liệu phụ thuộc Gửi và nhận bằng thành phần msg_control và msg_controllen của cấu trúc msghdr với hàm sendmsg và recvmsg chứa một hoặc nhiều đối tượng dữ liệu phụ thuộc each one begins with a cmsghdr structure struct cmsghdr { socklen_t cmsg_len; /* length in bytes, including this structure */ int cmsg_level; /* protocol family */ int cmsg_type; /* protocol-specific type */ /* followed by unsigned char cmsg_data[] */ };Dữ liệu phụ thuộc chứa hai đối tượng dữliệuCác hàm macros để đơn giản hóa xử lýdữ liệu phụ thuộc#include #include /* for ALIGN macro on many implementations */struct cmsghdr *CMSG_FIRSTHDR(struct msghdr *mhdrptr) ; Returns: pointer to first cmsghdr structure or NULL if no ancillary datastruct cmsghdr *CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr) ; Returns: pointer to next cmsghdr structure or NULL if no more ancillary data objectsunsigned char *CMSG_DATA(struct cmsghdr *cmsgptr) ; Returns: pointer to first byte of data associated with cmsghdr structureunsigned int CMSG_LEN(unsigned int length) ; Returns: value to store in cmsg_len given the amount of dataunsigned int CMSG_SPACE(unsigned int length) ; Returns: total size of an ancillary data object given the amount of datarecvfrom_flags function (2) advio/recvfromflags.c Dữ liệu phụ thuộc kiểu IP_RECVIFHàm dg_echo với recvfrom_flags advio/dgechoaddr.cChia nhỏ gói tin UDP Khi nhận một gói tin UDP lớn hơn kích thước buffer, hệ thống có thể xử lý theo các cách sau tùy thuộc vào từng OS Bỏ phần dữ liệu vượt quá kích thước buffer, và trả về cờ MSG_TRUNC cho tiến trình xử lý recvmsg thiết lập cờ MSG_TRUNC trong msg_flags của cấu trúc msghdr Bỏ phần dữ liệu thừa và không thông báo cho tiến trình xử lý Giữ phần dữ liệu thừa và trả về ở lần đọc dữ li ...