socket 收发缓冲区大小的问题

wanggk114 2014-10-31 04:41:57
网上资料说setsockopt是可以设置收发缓冲区的大小,如:
http://blog.csdn.net/jwybobo2007/article/details/6107419
http://blog.csdn.net/jwybobo2007/article/details/6156376

自己写了段C/S的代码做模拟测试,
客户端(port:33725)设置收、发缓冲区大小,服务端(port:4200)不做设置:
int32 iBufLen = 1024;
::setsockopt(cClient.get_sock(),SOL_SOCKET, SO_RCVBUF, &iBufLen, sizeof(int32));
::setsockopt(cClient.get_sock(),SOL_SOCKET, SO_SNDBUF, &iBufLen, sizeof(int32));
发送67200个字节的数据,服务端收到包后,原样返回。

tcpdump信息:


系统默认缓冲区大小:-------------这个值是指系统级(或内核或硬件层,不知专业术语是啥)缓冲区?而setsockopt设的只是应用级的?
[root@master ~]# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 3969024
[root@master ~]# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 3969024

从tcpdump信息看,客户端发包时拆了几个16384大小的包发的,看来与setsockopt无关;服务端回应答时,前3个包时16384的大小,但之后变为1536,有个别人1024,看来与setsockopt有关,但有分析不出具体关系。

求高手指点一下迷津,多谢
或者说怎么测试,才能测出SO_RCVBUF、SO_SNDBUF的效果?

系统:
Linux master 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

...全文
760 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
就想叫yoko 2015-01-14
  • 打赏
  • 举报
回复
设置recvbuf,不停的给你的程序发数据,你不调用recv,看recv-Q 设置sendbuf,你的程序不停给别人发数据,别人不收,你看send-Q
wanggk114 2015-01-14
  • 打赏
  • 举报
回复
引用 6 楼 xiayaazinabubu 的回复:
数据包每次发送大小和缓冲区没关系,应该和路由的MTU有关吧, 缓冲区应用程序可以设置的最大值受限于系统默认设置也就是你查出来的
多谢指点,太多概念混淆不清了。学学MTU先。
xiayaazinabubu 2015-01-14
  • 打赏
  • 举报
回复
数据包每次发送大小和缓冲区没关系,应该和路由的MTU有关吧, 缓冲区应用程序可以设置的最大值受限于系统默认设置也就是你查出来的
wanggk114 2015-01-14
  • 打赏
  • 举报
回复
又沉了。。。 求指点
wanggk114 2014-11-06
  • 打赏
  • 举报
回复
引用 3 楼 erhou134 的回复:
在connect or listen之前设置了?
客户端的程序,在connect之前、之后都试过,效果一样。
空的 2014-11-05
  • 打赏
  • 举报
回复
在connect or listen之前设置了?
wanggk114 2014-11-04
  • 打赏
  • 举报
回复
引用 1 楼 micropentium6 的回复:
多谢回复,但这个说明还是说发送缓冲区是可以用setsockopt设置的。和我测试的现象还是对不上啊。 另外,最大限制是229376: cat /proc/sys/net/core/wmem_max 229376 还请大家继续指点。
  • 打赏
  • 举报
回复
SO_SNDBUF Sets or gets the maximum socket send buffer in bytes. The kernel doubles this value (to allow space for bookkeeping overhead) when it is set using setsockopt(2), and this doubled value is returned by getsockopt(2). The default value is set by the /proc/sys/net/core/wmem_default and the maximum allowed value is set by the /proc/sys/net/core/wmem_max The minimum (doubled) value for this option is 2048. The maximum sizes for socket buffers declared via the SO_SNDBUF and SO_RCVBUF mechanisms are limited by the global net.core.rmem_max and net.core.wmem_max sysctls.

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧