我读了How large should my recv buffer be when calling recv in the socket library以了解读取中的缓冲区。关于tcp套接字连接中的读缓冲,我还想了解一些要点。 我的应用是发送视频数据包。当我将buff设置为80000时,发送方可以发送数据包,但是当我在发送少量数据包后将其设置为少于8000时,它会停止使用RST。
a)这个缓冲区,TCP接收窗口? b)这个缓冲区与.net.ipv4.tcp_rmem,.net.ipv4.tcp_wmem之间是否有任何关系?如果是,我应该根据rmem还是wmem设置读缓冲区?
我非常感谢任何回复
答案 0 :(得分:0)
a)这个缓冲区是TCP接收窗口吗?
不,它只是一个缓冲区,您为TCP堆栈提供了在调用recv()时放入字节的内容。
b)此缓冲区与.net.ipv4.tcp_rmem之间是否存在任何关系, .net.ipv4.tcp_wmem?
没有
如果是,我应该根据rmem或女性设置读缓冲区吗?
你可以传递你想要recv()的任何大小的缓冲区;它与上述任何一个都无关,除了使传递给recv()的缓冲区大于套接字当前的SO_RCVBUF大小没有任何好处,因为它不太可能是recv ()将一次返回比套接字内部缓冲区中更多的字节。
至于如何决定使用什么大小的缓冲区 - 考虑更大的缓冲区(当然)会占用更多的内存,如果你在堆栈上分配那个缓冲区,一个非常大的缓冲区可能会导致堆栈溢出。另一方面,较小的缓冲区意味着您可以通过任何给定的recv()调用来读取更少的字节,因此您可能需要多次调用recv()来读取相同的总字节数。
请注意,recv()返回的数据字节数可以是从1个字节到传递给recv()第三个参数的缓冲区总大小的任意数字,并且没有预测你会得到多少字节的方法。特别是,使用TCP,从recv()的任何特定调用接收的字节数不与先前传递给发送端的send()的任何特定调用的字节数有任何关联。 。所以你只需要使用一个合理大小的"数组(对于"合理大小"你更喜欢)的任何定义和recv()尽可能多的字节,然后处理那么多字节(基于recv()的返回值)