【发布时间】:2013-04-03 00:18:40
【问题描述】:
我正在尝试使用 C 系统调用编写一个简单的服务器,该服务器从未知客户端获取未知字节流,并根据客户端输入执行特定操作。例如,客户端将发送命令“乘 2 2”,服务器将数字相乘并返回结果。
为了避免服务器在客户端写入之前读取错误,我有一个阻塞的 recv() 调用来等待使用 MSG_PEEK 的任何数据。当 recv 检测到要读取的数据时,我会转到非阻塞 recv() 逐字节读取流。
除了客户端不发送数据的极端情况(即 write(socket, "", 0); )外,一切正常。我想知道如何准确检测到没有数据的消息已发送。在这种情况下,recv() 会永远阻塞。
另外,这篇文章几乎总结了我的问题,但它并没有提出检测大小为 0 数据包的方法。 What value will recv() return if it receives a valid TCP packet with payload sized 0
【问题讨论】:
-
write(socket, "", 0)在像 TCP 这样的基于流的协议中没有意义:(一个 1000 字节数据包后跟一个 0 字节数据包)、单个 1000 字节数据包之间没有语义差异,或两个 500 字节的数据包,因为它们都是 1000 字节的单个数据流。 -
你没有“消息”之类的东西,怎么会有“没有数据的消息”?!只有当你有某种支持消息的协议时,你才能拥有消息。您使用什么协议来支持消息?我没有看到。
标签: c sockets tcp system-calls recv