0

我有一个 Csocket客户端程序,其中一个thread用于接收数据,另一个用于发送。如果server关闭,则发件人得到EPIPE. 如果我重新连接它,socket那么它可以接收数据,但发件人仍然会收到EPIPE.

如何解决这个问题?

更新:实际上发件人似乎在发送数据,因为我看到发送的字节数。但是 errno 仍然设置为损坏的管道。之前我只检查了errno。不应该改成成功吗?

4

1 回答 1

1

如果我重新连接同一个套接字,那么它可以接收数据,但发送方仍然得到 EPIPE。

这只能意味着发送者仍在通过旧套接字发送;还有你还没有关闭旧的套接字。

当我看到发送的字节数时,发件人似乎正在发送数据。但errno仍然设置为破管。之前我只检查errno.过不应该改成成功吗?

errno不,只有在紧接之前的系统调用返回 -1 时检查才有效。例子:

int rc = send(...);
if (rc < 0)
{
    if (errno == EWOULDBLOCK) // or EAGAIN *and* we are in non-blocking mode
    {
        // queue the write and return to the select() loop
    }
    else
    {
        perror("send"); // for example
    }
}
else
{
    // write succeeded ...
}
于 2015-11-30T05:30:26.370 回答