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

时间:2010-02-26 16:48:38

标签: sockets unix

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

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

我问,因为我正在写一个服务器和一个客户端来测试它,但当我第一次读(2)并循环检查更多时,读(2)块并等待另一个写(2)来自客户端(因为我的客户端只有一个写入(2)而未来)。

如果我只是遗漏了一些简单的东西,有人可以指出它或给我一个很好的参考吗?

4 个答案:

答案 0 :(得分:3)

客户端需要在完成后关闭套接字。客户端关闭套接字后,服务器将收到EOF消息。如果客户端打开套接字但从未写入套接字,则服务器将永远等待另一条消息发生故障。

答案 1 :(得分:2)

您知道read返回时已完成:

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

答案 2 :(得分:0)

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

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

shutdown(socket, SHUT_WR);

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

答案 3 :(得分:0)

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