0

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

编辑:上述方法工作正常,我在其他地方有一个错误。

4

1 回答 1

5

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

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

于 2011-04-12T18:42:11.193 回答