Linux套接字上的SO_SNDBUF和SO_RCVBUF
我正在编写一个客户机-服务器应用程序。简单地说,服务器可以为每个客户端使用UDP或TCP 我希望TCP客户端和UDP客户端都打印的默认值 SO_SNDBUF和SO_RCVBUF,但当我在建立连接之前打印SNDBUF和RCVBUF的默认值时,我感到惊讶,该值为0 注意:我使用的是Ubuntu 12.10 这是我的密码:Linux套接字上的SO_SNDBUF和SO_RCVBUF,c,sockets,linux-kernel,C,Sockets,Linux Kernel,我正在编写一个客户机-服务器应用程序。简单地说,服务器可以为每个客户端使用UDP或TCP 我希望TCP客户端和UDP客户端都打印的默认值 SO_SNDBUF和SO_RCVBUF,但当我在建立连接之前打印SNDBUF和RCVBUF的默认值时,我感到惊讶,该值为0 注意:我使用的是Ubuntu 12.10 这是我的密码: //assume all variables initialized correctly. /* SO_RCVBUF options */ len = sizeof(rcvbu
//assume all variables initialized correctly.
/* SO_RCVBUF options */
len = sizeof(rcvbuf);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);
len = sizeof(mss);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss, &len);
printf("defaults: SO_RCVBUF = %d, MSS = %d\n", rcvbuf, mss);
rcvbuf = 9973; /* a prime number */
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf));
len = sizeof(rcvbuf);
getsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, &len);
printf("SO_RCVBUF = %d (after setting it to 9973)\n\n\n\n", rcvbuf);
/* SO_RCVBUF options */
/* SO_SNDBUF options */
len2 = sizeof(sndbuf);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &len2);
//len2 = sizeof(mss2);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, &mss2, &len2);
printf("defaults: SO_SNDBUF = %d, MSS = %d\n", sndbuf, mss2);
sndbuf = 9979; /* a prime number */
setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf));
len2 = sizeof(sndbuf);
getsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &sndbuf, &len2);
printf("SO_SNDBUF = %d (after setting it to 9979)\n", sndbuf);
/* SO_SNDBUF options */
样本输出:
默认值:SO_RCVBUF=0,MSS=0
因此,设置为9973后,_RCVBUF=9973
默认值:SO_SNDBUF=0,MSS=0
因此,设置为9979后,_SNDBUF=9979
tcp_时间nes411_服务器
当前时间为TCP:2013年4月22日星期一23:40:46
连接后:
SO_SNDBUF=170840,MSS=16384
显然,发送缓冲区和接收缓冲区是在调用connect时分配的,而不是在调用之前。您可能即将使用套接字进行侦听,在这种情况下,两个缓冲区都将完全浪费空间。或者是免费的,同上
注意:你为什么用质数?缓冲区大小通常使用二次幂。显然,发送缓冲区和接收缓冲区是在调用connect时分配的,而不是在调用connect之前。您可能即将使用套接字进行侦听,在这种情况下,两个缓冲区都将完全浪费空间。或者是免费的,同上
注意:你为什么用质数?缓冲区大小通常使用二次幂。您可以从下面的代码检查默认套接字缓冲区
int rcvBufferSize;
int sockOptSize = sizeof(rcvBufferSize);
getsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &rcvBufferSize, &sockOptSize);
printf("initial socket receive buf %d\n", rcvBufferSize);
您可以从下面的代码中检查默认套接字缓冲区
int rcvBufferSize;
int sockOptSize = sizeof(rcvBufferSize);
getsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &rcvBufferSize, &sockOptSize);
printf("initial socket receive buf %d\n", rcvBufferSize);
udp默认值应该是40K试试这个代码:udp默认值应该是40K试试这个代码:他已经在做这个了。他的问题是关于获得的价值,他已经在做了。他的问题是关于获得的值。