博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

UNP习题8.8,UDP/IPv4的数据大小

Posted on 2011-04-21 21:05  天地玄黄  阅读(576)  评论(0编辑  收藏  举报

      在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()只是测试用的,没有实际用途。