gpt4 book ai didi

tcp - 非阻塞 TCP 写入(2)成功但未发送请求

转载 作者:可可西里 更新时间:2023-11-01 02:45:06 26 4
gpt4 key购买 nike

我看到使用 write(2) 写入非阻塞 TCP 套接字的一小部分消息在源接口(interface)上看不到,目标也没有接收到。

可能是什么问题?应用程序有什么方法可以检测到并重试吗?

while (len > 0) {
res = write (c->sock_fd, tcp_buf, len);
if (res < 0) {
switch (errno) {
case EAGAIN:
case EINTR:
<handle case>
break;
default:
<close connection>
}
}
else {
len -= res;
}
}

最佳答案

非阻塞write(2) 意味着无论遇到什么困难,调用都会返回。检测发生了什么的正确方法是检查函数的返回值。

如果它返回 -1 检查 errnoEAGAIN 的值意味着 write 没有发生,您必须再次执行。

它也可能返回一个短写(即一个小于您传递给它的缓冲区大小的值),在这种情况下您可能想要重试丢失的部分。

如果这种情况发生在短暂的套接字上,另请阅读 The ultimate SO_LINGER page, or: why is my tcp not reliable .它解释了有关传输关闭部分的特定问题。

when we naively use TCP to just send the data we need to transmit, it often fails to do what we want - with the final kilobytes or sometimes megabytes of data transmitted never arriving.

结论是:

The best advice is to send length information, and to have the remote program actively acknowledge that all data was received.

它还描述了 Linux 的黑客攻击。

关于tcp - 非阻塞 TCP 写入(2)成功但未发送请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/585113/

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