你能解释一下究竟是什么SO_SNDBUF
和SO_RECVBUF
选择吗?
好的,由于某种原因,操作系统会缓冲输出/输入数据,但我想澄清这个问题.
他们的角色(一般)是什么?
它们是每插槽缓冲区吗?
传输层的缓冲区(例如TCP缓冲区)和这些缓冲区之间是否存在连接?
使用流套接字(TCP)和使用无连接套接字(UDP)时,它们是否具有不同的行为/角色?
一篇好文章也会很棒.
我搜索了它,但没有找到任何有用的信息.
"SO_"前缀用于"套接字选项",所以是的,这些是每个套接字缓冲区的每个套接字设置.通常有系统范围的默认值和最大值.
SO_RCVBUF
更容易理解:它是内核分配的缓冲区大小,用于保存在到达网络之间的时间内到达给定套接字的数据以及拥有此套接字的程序读取的数据.使用TCP,如果数据到达并且您没有读取它,则缓冲区将填满,并且将告知发送方减速(使用TCP窗口调整机制).对于UDP,一旦缓冲区已满,将丢弃新的数据包.
SO_SNDBUF
我认为,只对TCP很重要(在UDP中,无论你发送什么都直接发送到网络).对于TCP,如果远程端未读取,则可以填充缓冲区(以便远程缓冲区变满,然后TCP将此事实传达给内核,并且内核停止发送数据,而是将其累积到本地缓冲区中,直到它为止填上).或者,如果存在网络问题,它可能会填满,并且内核没有收到它发送的数据的确认.然后它将减慢在网络上发送数据的速度,直到最终输出缓冲区填满为止.如果是这样,write()
应用程序将来对此套接字的调用将阻塞(或者EAGAIN
如果您设置了该O_NONBLOCK
选项则返回).
这一切最好在Unix网络编程书中描述.
在Windows中,发送缓冲区确实在UDP中有效.如果你将数据包爆炸的速度超过网络可以传输它们的速度,那么最终你将填充套接字输出缓冲区,SendTo将失败并显示"将阻塞".增加SO_SNDBUF将有助于此.我不得不增加发送和接收缓冲区的测试,我正在做的是找到我可以在Windows机箱和Linux机箱之间发送的最大数据包速率.我也可以通过检测"会阻塞"错误代码,稍微休息并重试来处理发送大小.但是增加发送缓冲区大小更简单.Windows中的默认值是8K,在这个拥有GB的RAM的PC时代看起来毫无疑问!
在Google中搜索“ SO_RECVBUF msdn”给了我...
http://msdn.microsoft.com/zh-CN/library/ms740476(VS.85).aspx
通过选项表中的以下行可以回答“每个插座有问题”:
SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives. SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends.
稍后会有更多详细信息:
SO_RCVBUF和SO_SNDBUF
当Windows套接字实现支持SO_RCVBUF和SO_SNDBUF选项时,应用程序可以请求不同的缓冲区大小(更大或更小)。即使实现未提供请求的全部金额,对setsockopt的调用也可能成功。应用程序必须使用相同的选项调用getsockopt来检查实际提供的缓冲区大小。