如何确定是否完成从UNIX套接字读取()?

我一直在阅读手册页(2),根据手册页,read(2)的返回值为-1,错误时EOF为0,读取的字节数> 0。

如何判断客户端写入(2)何时完成?

我问,因为我正在编写一个服务器和一个客户端来testing它,但是当我第一次读(2)并循环查看更多时,读取(2)块并等待客户端的另一个写入(2) (这是不是因为我的客户端只有一个写(2))。

如果我只是想念一些简单的东西,有人可能会指出或指出我很好的参考?

客户端在完成时需要关闭套接字。 一旦客户端关闭套接字,服务器将收到EOF消息。 如果客户端打开套接字但从不写入,服务器将永远等待另一条消息下来。

read返回时,你知道你已经完成了:

  • -1 – 发生错误
  • 0 – EOF
  • 另一个非零值 – 这是最常见的情况。 您的协议需要使用指定消息大小的头部固定长度的消息来指定消息的大小。 然后,您可以跟踪读取的字节数,并且一旦读取了许多字节,就知道您已经完成了。 否则,您需要保持读取字节,直到您收到完整的消息。

读写之间没有对应关系。 单个客户端写入可能需要10次读取才能完全加载。 除非您在内容中添加分隔符,否则无法知道结束位置,除非套接字已关闭。

如果您仍然需要向客户端发送响应,则可以关闭客户端上的套接字:

 shutdown(socket, SHUT_WR); 

这将导致服务器上的读取返回0。

有些东西要看是使用select()首先检查数据,并指定一个合适的超时期限,而不是盲目地调用read() 。 这将允许您的服务器在一段时间不活动之后关闭套接字,并释放可能使用的任何资源等。