我正在编写一个通过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之前,从套接字读取的干净方法是什么?
编辑:上述方法运行正常,其他地方也有错误。
答案 0 :(得分:4)
recv()
返回0,如果有错误则返回-1。因此,您会在recv()
返回<=0
之前阅读。您发布的代码段看起来是正确的 - 为什么您认为它不适合您?会发生什么,你期待什么?
如果您的套接字是非阻止的,您还必须处理recv()
返回-1且errno
设置为EAGAIN
或EWOULDBLOCK
的情况。这意味着套接字仍然存活且很好,但现在没有更多数据了。