我有一个 Csocket
客户端程序,其中一个thread
用于接收数据,另一个用于发送。如果server
关闭,则发件人得到EPIPE
. 如果我重新连接它,socket
那么它可以接收数据,但发件人仍然会收到EPIPE
.
如何解决这个问题?
更新:实际上发件人似乎在发送数据,因为我看到发送的字节数。但是 errno 仍然设置为损坏的管道。之前我只检查了errno。不应该改成成功吗?
如果我重新连接同一个套接字,那么它可以接收数据,但发送方仍然得到 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 ...
}