在IPv4中,一个datagram 的大小最大为65535(2^16), IPv4的header 为20 bytes,UDP的header 为8 bytes,所以,data的大小最大就为65507 bytes。
使用Figure 8.7中的Client 的主函数,其中dg_cli 函数重新写了一下,让它可以传送最大的datagram:
#include "unp.h" #include <netinet/tcp.h> #define MAXSIZE 65507 void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { ssize_t n; char sendline[MAXSIZE], recvline[MAXSIZE + 1]; int size; socklen_t len; Getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, &len); printf("SO_SNDBUF is %d\n", size); size = 70000; Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size)); Getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, &len); printf("SO_SNDBUF is %d\n", size); Setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size)); while (1) { sleep(2); Sendto(sockfd, sendline, MAXSIZE, 0, pservaddr, servlen); n = Recvfrom(sockfd, recvline, MAXSIZE, 0, NULL, NULL); printf("received number is %d\n", n); recvline[n] = 0; /* null terminate */ //Fputs(recvline, stdout); } }
通过Setsockopt()函数把SO_SNDBUF 和 SO_RCVBUF都设定为70000,这样就可以传送大的数据包了,不过从server 返回的大小仍旧是4096,说明server端还没有改。用同样的方法,把server 端的dg_echo.c 文件修改一下就可以了。这里的Getsockopt()只是测试用的,没有实际用途。