Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux套接字上的SO_SNDBUF和SO_RCVBUF_C_Sockets_Linux Kernel - Fatal编程技术网

Linux套接字上的SO_SNDBUF和SO_RCVBUF

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

我正在编写一个客户机-服务器应用程序。简单地说,服务器可以为每个客户端使用UDP或TCP

我希望TCP客户端和UDP客户端都打印的默认值 SO_SNDBUF和SO_RCVBUF,但当我在建立连接之前打印SNDBUF和RCVBUF的默认值时,我感到惊讶,该值为0

注意:我使用的是Ubuntu 12.10

这是我的密码:

//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试试这个代码:他已经在做这个了。他的问题是关于获得的价值,他已经在做了。他的问题是关于获得的值。