UNIX套接字:如何检查TCP流是否因读取或EOF而关闭?

时间:2011-04-12 18:40:34

标签: sockets unix tcpclient eof

我正在编写一个通过TCP流读取二进制数据的简单客户端。 由于文件是逐个发送的,我有一个类似于这个的循环:

while (1 /* Maybe a check for EOF or if the socket is closed here ? */) {
  ssize_t bytes_red = recv(
  if (bytes_read <= 0) // not working properly ?
    break;
  ...
}

读取通过recv()方法完成,该方法返回接收的字节数。 这个想法显然是在打开TCP流时读取数据,但似乎上述方法对我不起作用。

还有其他想法吗?在流关闭或遇到EOF之前,从套接字读取的干净方法是什么?

编辑:上述方法运行正常,其他地方也有错误。

1 个答案:

答案 0 :(得分:4)

如果套接字正确关闭,

recv()返回0,如果有错误则返回-1。因此,您会在recv()返回<=0之前阅读。您发布的代码段看起来是正确的 - 为什么您认为它不适合您?会发生什么,你期待什么?

如果您的套接字是非阻止的,您还必须处理recv()返回-1且errno设置为EAGAINEWOULDBLOCK的情况。这意味着套接字仍然存活且很好,但现在没有更多数据了。