SO_SNDBUF和SO_RCVBUF Linux上的插座(SO_SNDBUF and SO_RCV

2019-08-31 19:54发布

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

我想无论是TCP客户端和UDP客户端打印默认值SO_SNDBUFSO_RCVBUF ,但我很惊讶,当我连接建立的值是0之前打印的sndbuf和rcvbuf默认值。

:我使用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

SO_RCVBUF = 9973(其设置为9973之后)

默认值:SO_SNDBUF = 0,MSS = 0

SO_SNDBUF = 9979(其设置为9979之后)

tcp_time nes411_server

当前时间是(TCP):周一04月22日二十三时40分46秒2013

连接后:

SO_SNDBUF = 170840,MSS = 16384

Answer 1:

显然,当你打电话的发送缓冲区和接收缓冲区分配connect(),而不是之前。 你可能是即将用于监听套接字,在这种情况下,这两个缓冲区将空间完全是浪费。 或者白白,同上。

NB你为什么要使用一个素数? 这是习惯使用的两个大国的缓冲区大小。



Answer 2:

您可以检查从下面的代码缺省套接字缓冲区。

int rcvBufferSize;
int sockOptSize = sizeof(rcvBufferSize);
getsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &rcvBufferSize, &sockOptSize);
printf("initial socket receive buf %d\n", rcvBufferSize);

https://gist.github.com/rdp/8198697



文章来源: SO_SNDBUF and SO_RCVBUF on Linux sockets