gpt4 book ai didi

Centos 6 写入套接字静默失败?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:22 25 4
gpt4 key购买 nike

我在 Centos 6 (Linux 2.6.32) 系统上有两个进程,它们通过 AF_INET/SOCK_STREAM 套接字相互通信。当我通过爆破足够小的数据包来填充套接字然后退出发送进程来对链路进行压力测试时,接收进程丢失了最后 3/4 左右的数据包。

发送进程一退出,接收方的poll()就开始返回POLLIN | POLLRDHUP |波勒尔 | POLLHUP。在某些时候,它无法读取它期望的完整数据包(read() 返回的数字小于传入的长度),并且以下 read() 返回 -1,errno 设置为 ECONNRESET)。在我看来,它确实已经读取了管道中的所有数据,并且没有更多数据了。

如果我在填充管道后不退出发送过程(只是进入无限循环直到我用手杀死它),那么接收方将获得所有数据。

我的猜测是,这意味着发送者的 write()s 最终被缓冲在某个地方,如果它退出,该缓冲区将被丢弃,而不是返回失败。禁用 Nagle(打开 TCP_NODELAY)不会改变此行为。

执行写入的代码是:

iov[0].iov_base = &len;
iov[0].iov_len = sizeof(uint32_t);
iov[1].iov_base = buf;
iov[1].iov_len = len;
if ((wlen = writev(fd, iov, NELEM(iov))) != (iov[0].iov_len + iov[1].iov_len)) {
... // error handling

(它发送 32 位长度后跟数据)。

谁能告诉我发生了什么,以及我如何可靠地知道我的 write() 是否成功?

最佳答案

在关闭 writer 进程之前,您应该通过 shutdown 干净地关闭套接字。调用:

shutdown(fd, SHUT_WR);

这有点像您正在冲洗 socket 。

您也可以close socket ,看到这个问题:close vs shutdown socket?获取详细信息。

关于Centos 6 写入套接字静默失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41233068/

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