gpt4 book ai didi

Linux TCP/IP 非阻塞发送套接字流..TCP 接收缓冲区发生了什么?

转载 作者:可可西里 更新时间:2023-11-01 02:37:59 27 4
gpt4 key购买 nike

这与 Linux 内核 2.6 TCP 套接字有关。

我正在发送大量数据,比如 300 MB,并以非阻塞方式发送给另一个客户端,该客户端一次接收 8 MB。

接收一个 8 MB 后,“接收方”停止接收,因为它要执行其他任务,例如错误处理。发送方会收到 EWOULDBLOCK,但由于它是异步通信,发送方会尝试填充另一端的 TCP 接收缓冲区。

我的问题是:即使“发送方”收到 EWOULDBLOCK 而“接收方”停止接收,TCP 接收缓冲区中是否仍有数据?同一个套接字用于错误处理,那么“接收方”是否必​​须在尝试重用现有套接字之前清除 TCP 接收缓冲区?

最佳答案

是的。当您收到 EWOULDBLOCK 时,很可能(事实上很可能)您已经发送的某些数据尚未被接收应用程序读取。此缓冲数据将可供套接字上的下一个读取使用。

这意味着,如果您的接收方随后向发送方发送“糟糕,请不要再发送”消息,则发送方无法对该消息采取行动并“取消发送”数据。一旦它被传递给 write()/send(),它就在路上并且不能被召回。

您的接收方将不得不通过读出它不再感兴趣的数据并将其丢弃来处理这种可能发生的情况,这意味着您需要在数据流中使用某种事务分隔符。

关于Linux TCP/IP 非阻塞发送套接字流..TCP 接收缓冲区发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1391570/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com