我一直在阅读手册页进行阅读(2),根据手册页,read(2)的返回值在错误时为-1,在EOF上为0,并且读取的字节数大于0。如何确定我是否完成从UNIX套接字读取()?
如何判断客户端写入(2)何时完成?我想问,因为我正在写一个服务器和一个客户端来测试它,但是当我第一次读取(2)并循环查看更多内容时,请阅读(2)块并等待另一次写入(2) )(这不是因为我的客户端只有一个写(2))。
如果我只是缺少一些简单的东西,有人可以指出它或指出我很好的参考?
我一直在阅读手册页进行阅读(2),根据手册页,read(2)的返回值在错误时为-1,在EOF上为0,并且读取的字节数大于0。如何确定我是否完成从UNIX套接字读取()?
如何判断客户端写入(2)何时完成?我想问,因为我正在写一个服务器和一个客户端来测试它,但是当我第一次读取(2)并循环查看更多内容时,请阅读(2)块并等待另一次写入(2) )(这不是因为我的客户端只有一个写(2))。
如果我只是缺少一些简单的东西,有人可以指出它或指出我很好的参考?
客户端在完成时需要关闭套接字。一旦客户端关闭套接字,服务器将收到EOF消息。如果客户端打开套接字但从不写入,服务器将永远等待另一条消息下来。
什么时候客户端和服务器有多个读/写?挪亚建议我是否必须开始使用标题? – 2010-02-26 17:00:29
你真的不应该关闭套接字来接收一条消息。我认为贾斯汀的回答是正确的。 – ChaosPandion 2010-02-26 17:05:35
@Chaos,我明白OP只希望*发送/接收一条消息。 @Alex,如果你想接收多条消息,那么你可以按照Noah的建议使用信号,在当前消息中添加一个头字节数或者使用面向消息的协议。 – 2010-02-26 17:31:25
你知道你做的时候read
回报:
所有这一切都在问题中说明。 – noah 2010-02-26 16:57:02
@noah - 你读了列表中的最后一项吗? – ChaosPandion 2010-02-26 16:59:36
@Chaos - 确实如此。 @noah - 前两个提到,但最后(也是最重要的!)子弹不是。关键是你需要另一种从套接字读取多个消息的策略。除了我描述的方法之外,您还可以根据您的建议使用分隔符,并提供一些注意事项。 – 2010-03-14 16:46:05
读写之间没有对应关系。单个客户端写入可能需要10次读取才能完全加载。除非您在内容中添加分隔符,否则无法知道结束位置,除非套接字已关闭。
如果您仍然需要发送给客户端的响应,你可以半关闭套接字在客户端上:
shutdown(socket, SHUT_WR);
,这将导致在服务器上读取返回0。
你建议什么样的分度?你怎么知道分隔符不会出现在消息数据中? – 2010-02-26 17:08:25
我认为他的意思是像一个空字符。 (如果您正在发送文本)。 – ChaosPandion 2010-02-26 17:09:10
只要客户端在数据正常出现时将其转义,您就可以使用任何您想要的分隔符。但除非需要连接保持打开状态,否则(一半)关闭插座是更好的选择。 – noah 2010-02-26 20:59:09
东西看看会先用select()
来检查数据,并指定一个合适的超时期限,而不是只是一味地调用read()
。这将允许您的服务器在一段时间不活动后关闭套接字,并释放可能使用的任何资源等。
男人,这是一个很常见的问题。 – ChaosPandion 2010-02-26 16:51:14
本质上是这样的一个骗局:http://stackoverflow.com/questions/2306481/net-newbie-socket-problem – ChaosPandion 2010-02-26 16:52:58