【问题标题】:UNIX sockets: How to check if TCP stream is closed for reading or EOF?UNIX 套接字:如何检查 TCP 流是否已关闭以进行读取或 EOF?
【发布时间】:2011-04-12 18:40:34
【问题描述】:

我正在编写一个简单的客户端,它通过 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 之前,从套接字读取的干净方法是什么?

编辑:上述方法工作正常,我在其他地方遇到了错误。

【问题讨论】:

  • "Encounter an EOF" in this case 等同于"socket is closed"

标签: sockets unix tcpclient eof


【解决方案1】:

recv() 如果套接字正确关闭,则返回 0,如果有错误,则返回 -1。所以,你一直读到recv() 返回&lt;=0。您发布的代码 sn-p 看起来正确 - 为什么您认为它不适合您?发生了什么,你期待什么?

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

【讨论】:

  • 我试过这个,但正如我所说,当我发送随机二进制数据时它似乎不起作用。你 100% 确定这是正确的方法吗?
  • @leden:是的。如果您的套接字是非阻塞的,您还必须处理特定的错误代码,但上述正确的方法。
  • @leden:它是非阻塞套接字吗?将哪些标志传递给recv
  • 不,它是一个阻塞套接字,没有传递任何标志。
  • @leden:那么您可能还有另一个错误。 recv() 的行为定义明确,并且有效。
猜你喜欢
  • 2019-02-06
  • 1970-01-01
  • 2010-10-23
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多