zoukankan      html  css  js  c++  java
  • UNP习题8.8,UDP/IPv4的数据大小

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

  • 相关阅读:
    C语言I博客作业09
    C语言I博客作业08
    C语言I作业07
    C语言博客作业06
    C语言I博客作业05
    C语言I博客作业04
    C语言I博客作业03
    C语言|博客作业07
    C语言|博客作业06
    C语言|博客作业05
  • 原文地址:https://www.cnblogs.com/wangshuo/p/2024177.html
Copyright © 2011-2022 走看看