SOCKET缓冲区的设置

frankielee 2010-07-01 10:50:35
在使用socket编程时(笔者使用socket完成进程间通信),往往会设置socket缓冲区的大小,偶有心得,分享给大家:
(1)socket可以设置发送缓冲区和接受缓冲区。一般的操作步骤为:创建socket---bind---然后设置大小。socket缓冲区一旦设置,就不能随意更改,直到该socket被关闭。原因为 socket缓冲区是OS映射的一块动态内存,从应用层根本没有办法知道缓冲区的具体地址,也许你会说可以拿着socket的文件描述符去重新设置socket缓冲区大小,但这样显然不合适,因为原来缓冲区中的数据就没有了。
(2)socket的缓冲区设置受两个因素制约,取决于怎么使用。
I:基本说明,在/proc/sys/net/core/目录下有 wmem_default、rmem_default、wmem_max、rmem_max四个配置值。通俗的说就是四个配置项。申请的socket的缓冲区的大小受他们的限制。
II:如果创建socket的时候,没有设置socket缓冲区的大小,那创建的socket缓冲区的最大值受default值的限制,既发送缓冲区为wmem_default;接受缓冲区为rmem_default。如果创建socket的时候,重新设置了socket缓冲区的大小,那此时socket缓冲区的大小就与default没有关系了,设置的socket缓冲区的值,最大不超过max的值。
III:如果default的值比max的值大,会有什么效果?---设置了缓冲区的大小反而没有默认的值大
IV:拿这些配置项如何修改,很简单,就是文件的操作,先open,然后write,如:write(socketid,"204800\n",sizeof("204800\n"))就OK了。
...全文
969 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jngd 2011-08-30
  • 打赏
  • 举报
回复
用通用的方法不行么?
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &buff_size, sizeof (buff_size));
setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buff_size, sizeof (buff_size));
shenyan008 2011-08-30
  • 打赏
  • 举报
回复
学习了,接分。
program2050 2011-08-30
  • 打赏
  • 举报
回复
学习啦。
do_fork 2010-07-02
  • 打赏
  • 举报
回复
如果是BSD系的系统,是没有procfs的,方法不同
do_fork 2010-07-02
  • 打赏
  • 举报
回复
准确的说,在Linux下,如果用fd设置单独的缓冲区大小,必须在listen和connect之前.
On individual connections, the socket buffer size must be set
prior to the listen(2) or connect(2) calls in order to have it take effect.



在Linux下,如果进程拥有CAP_NET_ADMIN权限,可以不受/proc/sys/net/core/下那几个限制。

一般不需要自己设置缓冲区大小,内核会自己调整。
cattycat 2010-07-01
  • 打赏
  • 举报
回复
tcp/ip详解2实现上有说明吧
liutengfeigo 2010-07-01
  • 打赏
  • 举报
回复
楼主好人。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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