是否可以检查非阻塞套接字是否已关闭?

时间:2018-05-24 19:16:51

标签: linux sockets tcp

我想在尝试读取套接字之前检查套接字是否仍处于活动状态,但似乎recv()和read()将返回0,无论如何。根据手册页:

  

当流套接字对等体执行了有序关闭时,返回值将为0(传统的"文件结束"返回)。

但是:

  

如果从流套接字接收的请求字节数为0,则也可以返回值0。

如何区分这两种情况?如果那是不可能的,还有其他一些方法可以判断套接字是否已关闭/关闭?

2 个答案:

答案 0 :(得分:2)

使用非零<button class="list-group-item" disabled>Select me</button> <button class="list-group-item">But no me</button>recv()标记来呼叫length。然后检查返回值是否为MSG_PEEK。使用0可以防止这种情况消耗任何数据 - 下一个MSG_PEEK会再次阅读。

答案 1 :(得分:-1)

以上都不是正确答案。

非阻塞套接字将返回-1并设置errno == EAGAIN || errno == EWOULDBLOCK,如果根本没有新数据。 如果连接正常,远程对等端recv将返回0。