修改socket缓冲区大小

Posted rivsidn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修改socket缓冲区大小相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/socket.h>

#include <unistd.h>


int main()
{
    int ret;
    int sockfd;
    int sockbuflen = 0;
    int len = sizeof(sockbuflen);

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        fprintf(stderr, "sockfd get error ");
        return -1;
    }
    
    ret = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void *)&sockbuflen, &len);
    if (ret < 0) {
        fprintf(stderr, "getsockopt error ");
        return -1;
    }
    printf("%d ", sockbuflen);
    
    sockbuflen = 4480;
    setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void *)&sockbuflen, len);
    
    ret = getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, (void *)&sockbuflen, &len);
    if (ret < 0) {
        fprintf(stderr, "getsockopt error ");
        return -1;
    }
    printf("%d ", sockbuflen);

    return 0;
}

函数用法,参数选项在《UNIX网络编程_卷1》第七章,套接字选项中有详细叙述,需要的可以查阅。

 

此处需要注意的是:

1.getsockopt() 参数中的len必须初始化成 sizeof(int) ,此处容易跟recvfrom中的addrlen混淆。

2.设置sockbuflen之后获取出来的数值是设置的2倍/*暂时没有深入探究原因*/

 

第一个原因是因为,看code

 

int sock_getsockopt(struct socket *sock, int level, int optname,
            char *optval, int *optlen)
{
    struct sock *sk = sock->sk;
    
    union
    {
          int val;
          struct linger ling;
        struct timeval tm;
    } v;
    
    int lv=sizeof(int),len;
      
      if(get_user(len,optlen))
          return -EFAULT;

      switch(optname) 
      {
     /*...*/case SO_SNDBUF:
            v.val=sk->sndbuf;
            break;
        
        case SO_RCVBUF:
            v.val =sk->rcvbuf;
            break;
     /*...*/default:
            return(-ENOPROTOOPT);
    }
    len=min(len,lv);
    if(copy_to_user(optval,&v,len))
        return -EFAULT;
lenout:
      if(put_user(len, optlen))
          return -EFAULT;
      return 0;
}

 

当len为0时候,于copy_to_user中的len为0,所以optval,也就是getsockopt获取的数值实际上是没变的。









































以上是关于修改socket缓冲区大小的主要内容,如果未能解决你的问题,请参考以下文章

linux下socket接收缓冲区有多大?如何查看和修改,望高手赐教

非阻塞方式socket send()返回大小和实际发送大小不一致

socket tcp缓冲区大小的默认值最大值

udp Socket 发送缓冲区 最大可以为多大

c程序计算默认缓冲区的大小

如何得知socket的缓存大小,这个缓存是不是有