2010-02-26 36 views
1

我一直在阅读手册页进行阅读(2),根据手册页,read(2)的返回值在错误时为-1,在EOF上为0,并且读取的字节数大于0。如何确定我是否完成从UNIX套接字读取()?

如何判断客户端写入(2)何时完成?我想问,因为我正在写一个服务器和一个客户端来测试它,但是当我第一次读取(2)并循环查看更多内容时,请阅读(2)块并等待另一次写入(2) )(这不是因为我的客户端只有一个写(2))。

如果我只是缺少一些简单的东西,有人可以指出它或指出我很好的参考?

+1

男人,这是一个很常见的问题。 – ChaosPandion 2010-02-26 16:51:14

+0

本质上是这样的一个骗局:http://stackoverflow.com/questions/2306481/net-newbie-socket-problem – ChaosPandion 2010-02-26 16:52:58

回答

3

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

+0

什么时候客户端和服务器有多个读/写?挪亚建议我是否必须开始使用标题? – 2010-02-26 17:00:29

+1

你真的不应该关闭套接字来接收一条消息。我认为贾斯汀的回答是正确的。 – ChaosPandion 2010-02-26 17:05:35

+0

@Chaos,我明白OP只希望*发送/接收一条消息。 @Alex,如果你想接收多条消息,那么你可以按照Noah的建议使用信号,在当前消息中添加一个头字节数或者使用面向消息的协议。 – 2010-02-26 17:31:25

2

你知道你做的时候read回报:

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

所有这一切都在问题中说明。 – noah 2010-02-26 16:57:02

+1

@noah - 你读了列表中的最后一项吗? – ChaosPandion 2010-02-26 16:59:36

+0

@Chaos - 确实如此。 @noah - 前两个提到,但最后(也是最重要的!)子弹不是。关键是你需要另一种从套接字读取多个消息的策略。除了我描述的方法之外,您还可以根据您的建议使用分隔符,并提供一些注意事项。 – 2010-03-14 16:46:05

0

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

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

shutdown(socket, SHUT_WR); 

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

+0

你建议什么样的分度?你怎么知道分隔符不会出现在消息数据中? – 2010-02-26 17:08:25

+0

我认为他的意思是像一个空字符。 (如果您正在发送文本)。 – ChaosPandion 2010-02-26 17:09:10

+0

只要客户端在数据正常出现时将其转义,您就可以使用任何您想要的分隔符。但除非需要连接保持打开状态,否则(一半)关闭插座是更好的选择。 – noah 2010-02-26 20:59:09

0

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

相关问题