我一直在阅读read(2)的手册页,根据手册页,read(2)的返回值在出错时为-1,在EOF上为0,并且> 0表示读取的字节数。
如何判断客户端上的写入(2)何时完成?
我问,因为我正在写一个服务器和一个客户端来测试它,但当我第一次读(2)并循环检查更多时,读(2)块并等待另一个写(2)来自客户端(因为我的客户端只有一个写入(2)而未来)。
如果我只是遗漏了一些简单的东西,有人可以指出它或给我一个很好的参考吗?
答案 0 :(得分:3)
客户端需要在完成后关闭套接字。客户端关闭套接字后,服务器将收到EOF消息。如果客户端打开套接字但从未写入套接字,则服务器将永远等待另一条消息发生故障。
答案 1 :(得分:2)
您知道read
返回时已完成:
答案 2 :(得分:0)
读写之间没有对应关系。单个客户端写入可能需要10次读取才能完全加载。除非你在内容中加上分隔符,否则你无法知道结尾的位置,除非套接字被关闭。
如果您仍需要向客户端发送响应,则可以关闭客户端上的套接字:
shutdown(socket, SHUT_WR);
这将导致服务器上的读取返回0.
答案 3 :(得分:0)
要注意的是首先使用select()
检查数据,并指定合适的超时时间,而不是盲目地调用read()
。这将允许您的服务器在一段时间不活动后关闭套接字,并释放它可能使用的任何资源等。