0

我在我的应用程序中使用 winsock 来维护客户端-服务器连接,并使用非阻塞套接字来做到这一点。但有时当我收到FD_READ消息时,似乎recv()返回的不是一个,而是两个数据包。

我尝试更改数据包的大小,使它们彼此不同,然后将其与recv()返回的数据量进行比较。我 100% 确定我不时收到两个数据包。我认为我的 ping 功能应该受到指责。我的应用程序中有一个线程不时发送 ping 消息。然后对方回复了另一条消息。不确定这是否是最好的方法,但无论如何,现在都无所谓了。

我可以肯定的是,有时这些消息会“混合”,因此会recv()立即返回“ping request”和“ping answer”。它是如何发生的?不应该只返回单个调用发送recv()的数据量吗?send()即使有时客户端或服务器收到“ping请求”消息并回复它,同时发送自己的“ping请求”消息,即使这种不幸的时机是可能的,另一方不应该能够将一个数据包与另一个数据包区分开来并返回每条FD_READ消息一个?

4

2 回答 2

1

很有可能您在上次调用 recv 和收到两个数据包之间确实收到了两个数据包。recv 不会一次获取一个数据包,它会读取缓冲区中所有可用的数据。这意味着可能有不止一条数据消息可用,或者可能只有部分消息可用。(如果它是一个足够大的消息,它将被分成多个数据包。)解码自己的数据是你的工作。执行此操作的一种简单方法是添加包含一些信息的标头以帮助您,例如消息 ID 或预期数据大小的指示。通常,带有 CRC 的页脚来验证数据完整性(并确保您拥有完整的消息)也不会受到伤害。

于 2013-05-21T20:04:20.313 回答
1

TCP 是数据流,而不是数据包流。UDP 是数据包流。正如 Anthony 所说,如果您使用 TCP,您必须处理一段数据结束的位置和下一段数据的开始位置。

于 2013-05-21T20:06:45.297 回答