我有一个C socket
客户端程序,其中一个thread
用于接收数据,另一个用于发送。如果server
关闭,则发件人获得EPIPE
。如果我重新连接相同的socket
,那么它可以接收数据,但发件人仍然会获得EPIPE
。
如何解决这个问题?
更新: 实际上发送者似乎发送数据,因为我看到发送的字节数。但是errno仍然会被打破。之前我只检查过errno。难道不能改成成功吗?
答案 0 :(得分:1)
如果我重新连接相同的套接字,那么它可以接收数据但发送方仍然获得EPIPE。
这只能意味着发件人仍在通过旧套接字发送;你还没有关闭旧套接字。
发送者似乎发送数据,因为我看到发送的字节数。但
errno
仍然设置为破管。在我仅检查errno.
之前,是否应该将其更改为成功?
没有。仅在前一次系统调用返回-1时检查errno
才有效。例如:
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 ...
}