【发布时间】:2015-06-16 09:52:48
【问题描述】:
让我们想象一下从服务器发送到客户端的以下数据序列:
[data] [data] [data] [FIN] [RST]
假设我在客户端执行以下操作(套接字是非阻塞的):
char buf[sizeof(data)];
for (;;)
{
rlen = recv(..., buf, sizeof(buf), ...);
rerr = errno;
slen = send(..., "a", 1, ...);
serr = errno;
}
我什么时候会看到ECONNRESET 错误?
我对以下极端情况特别好奇。让我们假设上面想象的序列的所有 IP 帧都已被 TCP 堆栈接收并ACKed。但是,我的客户端应用程序还没有 send() 或 recv() 任何东西。第一次调用send() 会返回ECONNRESET 吗?如果是这样,下一次对recv() 的调用是否会成功并允许我在开始报告ECONNRESET 之前读取它在其内部缓冲区中的所有内容(因为它接收到数据并拥有它)(或由于FIN 而返回0) )?或者会发生什么不同的事情?
我将特别感谢解释该情况的文档中的链接。我正在尝试 grok linux tcp implementation 来解决这个问题,但还不是很清楚......
【问题讨论】: