SO_SNDBUF和SO_RCVBUF Linux上的插座 [英] SO_SNDBUF and SO_RCVBUF on Linux sockets

查看:211
本文介绍了SO_SNDBUF和SO_RCVBUF Linux上的插座的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

注意:我使用Ubuntu 12.10

下面是我的code:

  //假设正确初始化所有变量。/ * SO_RCVBUF选项* /LEN = sizeof的(rcvbuf);
用getsockopt(的sockfd,SOL_SOCKET,SO_RCVBUF,&安培; rcvbuf,和放大器; LEN);
LEN = sizeof的(MSS);
用getsockopt(的sockfd,IPPROTO_TCP,TCP_MAXSEG,&安培; MSS,和放大器; LEN);
的printf(默认:SO_RCVBUF =%d个,MSS =%d个\\ N,rcvbuf,MSS);rcvbuf = 9973; / *质数* /
setsockopt的(的sockfd,SOL_SOCKET,SO_RCVBUF,&安培; rcvbuf,sizeof的(rcvbuf));
LEN = sizeof的(rcvbuf);
用getsockopt(的sockfd,SOL_SOCKET,SO_RCVBUF,&安培; rcvbuf,和放大器; LEN);
的printf(SO_RCVBUF =%d个(将其设置为9973)后,\\ n \\ n \\ n \\ n,rcvbuf);
/ * SO_RCVBUF选项* /
/ * SO_SNDBUF选项* /LEN2 = sizeof的(sndbuf);
用getsockopt(的sockfd,SOL_SOCKET,SO_SNDBUF,&安培; sndbuf,&安培; LEN2);
// LEN2 = sizeof的(MSS2);
用getsockopt(的sockfd,IPPROTO_TCP,TCP_MAXSEG,&安培; MSS2,&安培; LEN2);
的printf(默认:SO_SNDBUF =%d个,MSS =%d个\\ N,sndbuf,MSS2);sndbuf = 9979; / *质数* /
setsockopt的(的sockfd,SOL_SOCKET,SO_SNDBUF,&安培; sndbuf,sizeof的(sndbuf));
LEN2 = sizeof的(sndbuf);
用getsockopt(的sockfd,SOL_SOCKET,SO_SNDBUF,&安培; sndbuf,&安培; LEN2);
的printf(SO_SNDBUF =%d个(将其设置为9979后)\\ n,sndbuf);/ * SO_SNDBUF选项* /

示例输出:


  

默认: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日23点40分46秒2013


连接后:


  

SO_SNDBUF = 170840,MSS = 16384



解决方案

显然,发送缓冲区和接收缓冲区,当你调用连接(分配),而不是之前。你可能是即将用于监听的插座,在这种情况下,这两个缓冲区将是空间完全是浪费。或者什么,同上。

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

I am programming a client server application. Simply, the server can use either UDP or TCP for each client.

I want both the TCP client and UDP client to print the default value for SO_SNDBUF and SO_RCVBUF, but I am surprised when I print the default value for sndbuf and rcvbuf before the connection establishment the value is 0.

Note: I am using Ubuntu 12.10

Here is my code:

//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 */

Sample output:

defaults: SO_RCVBUF = 0, MSS = 0

SO_RCVBUF = 9973 (after setting it to 9973)

defaults: SO_SNDBUF = 0, MSS = 0

SO_SNDBUF = 9979 (after setting it to 9979)

tcp_time nes411_server

Current time is (TCP): Mon Apr 22 23:40:46 2013

After connection:

SO_SNDBUF = 170840, MSS = 16384

解决方案

Obviously the send buffer and receive buffer are allocated when you call connect(), not before. You could be about to use the socket for listening, in which case both buffers would be a complete waste of space. Or for nothing, ditto.

NB Why are you using a prime number? It's customary to use powers of two for buffer sizes.

这篇关于SO_SNDBUF和SO_RCVBUF Linux上的插座的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆