LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 805|回复: 2

有关setsockopt的问题

[复制链接]
发表于 2010-4-19 09:57:50 | 显示全部楼层 |阅读模式
最近写了一个TCP程序,其中使用到了setsockopt这个函数,想通过设置发送缓冲区大小提升TCP的性能。但是发现一个问题,不太明白,请大家帮我看看。
首先,我使用getsockopt获得了默认状态下的发送缓冲大小,得到的结果是16384,即默认是16K。
然后,我使用setsockopt函数将发送缓冲区大小想得比较大,直接就设为350000,返回值表示调用这个函数成功。不过当我调用getsockopt查看时,发现缓冲区大小并未修改为我预期的350000,而是262142(接近于256K)。

我的问题如下:
1)256K是不是就是TCP发送缓冲区的上限?
2)另外,如果我将缓冲区的值设置为小于256K,则实际得到的缓冲区的值是我设置值的两倍(前提是两倍的值小于256K)。即如果我将缓冲区设置为3000,则实际得到的缓冲区的值是6000。这是什么原因?

谢谢!
发表于 2010-4-19 10:16:49 | 显示全部楼层
SO_SNDBUF
              Sets or gets the maximum socket send buffer in bytes.  The  ker-
              nel doubles this value (to allow space for bookkeeping overhead)
              when it is set using setsockopt(), and  this  doubled  value  is
              returned  by  getsockopt().   The  default  value  is set by the
              wmem_default sysctl and the maximum allowed value is set by  the
              wmem_max sysctl.  The minimum (doubled) value for this option is
              2048.
你很会观察问题,linux的内核确实是你描述的如此特性。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-19 11:27:10 | 显示全部楼层
谢谢你的回复!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表