修改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接收缓冲区有多大?如何查看和修改,望高手赐教