Professional Documents
Culture Documents
struct 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)
advio/recvfromflags.c
Dữ liệu phụ thuộc kiểu IP_RECVIF
Hàm dg_echo với recvfrom_flags
advio/dgechoaddr.c
Chia 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ệu
socket sau đó
=> cần thiết lập kích thước buffer lớn hơn kích thước lớn
nhất của gói tin UDP có thể nhận được một byte
Tạo tính tin cậy cho ứng dụng UDPs
g = 1/8, h = 1/4
Vấn đề không rõ ràng khi gửi lại
rtt/dg_send_recv.c
g = 1/8, h = 1/4
Các bước thực hiện
Khởi tạo đồng hồ đếm độ trễ
rtt_init(&rtti
nfo)
Khởi tạo dữ liệu gửi msgsend
• Tiêu đề chứa sequence number và nhãn thời gian
lib/rtt.c
rtt_init
sigio/dgecho01.c
Đặt dữ liệu nhận được trong hàng đợi dữ liệu chờ
xử lý
Sau khi xử lý tín hiệu SIGIO, tăng biến đếm của
hàng đợi nqueue
Gửi lại dữ liệu nhận được khi biến đếm của hàng
đợi khác 0