重新连接到服务器

时间:2015-11-30 03:35:25

标签: c sockets epipe

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

如何解决这个问题?

更新: 实际上发送者似乎发送数据,因为我看到发送的字节数。但是errno仍然会被打破。之前我只检查过errno。难道不能改成成功吗?

1 个答案:

答案 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 ...
}