在Linux上,套接字中的缓冲区是如何工作的?

5

在Linux中,套接字的缓冲区是如何工作的呢?例如,如果服务器不读取套接字并且客户端不断发送数据,会发生什么情况?套接字的缓冲区有多大?客户端是否知道应该停止发送数据呢?

3个回答

5

对于UDP套接字客户端来说,它永远不会知道-服务器端只会在接收缓冲区填满后开始丢弃数据包。

另一方面,TCP实现了流量控制。服务器的内核将逐渐减小窗口,因此客户端将能够发送越来越少的数据。在某些时候,窗口将降至零。此时客户端填满其发送缓冲区并从send(2)中接收到错误。


1
TCP套接字在协议栈中使用缓冲区。协议栈本身实现了流量控制,因此如果服务器的缓冲区已满,它将停止客户端栈发送更多数据。您的代码将把这视为对send()的阻塞调用。缓冲区大小可以从几KB到几MB不等。

1

我假设你在使用send()recv()进行客户端和服务端之间的通信。

因此,send()将返回发送的字节数。这不一定等于您想要发送的字节数,所以您需要意识到这一点并发送剩下的数据。

现在,recv()返回读取到缓冲区中的字节数。因此,如果recv返回0,则服务器可能已关闭连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接