我在我的应用程序中使用winsock来保持客户端 - 服务器连接,并使用非阻塞套接字来实现这一点。但有时当我收到FD_READ
消息时,似乎recv()
不返回一个,而是返回两个数据包。
我尝试更改数据包的大小,使它们彼此不同,然后将其与返回的数据量recv()
进行比较。我100%确定我不时会收到两个数据包。我认为我的ping函数应该受到指责。我的应用程序中有一个线程,可以不时发送ping消息。然后另一方回复另一条消息。不确定这是否是最佳方式,但无论如何,现在无关紧要。
我确切知道有时这些消息会“混合”,因此recv()
会立即返回“ping请求”和“ping应答”。怎么会发生? recv()
是否应仅返回单send()
次调用发送的数据量?即使有时客户端或服务器收到“ping请求”消息并回复它,在发送自己的“ping请求”消息时,即使可能存在这样的不幸时间,也不应该让另一方能够将一个数据包与另一个数据包不同并返回每FD_READ
条消息一个?
答案 0 :(得分:1)
在你最后一次调用recv和获得两个数据包的时间之间,你确实收到了两个数据包。 recv一次不会获得一个数据包,它将读入缓冲区中的所有可用数据。这意味着可能有多个数据消息可用,或者可能只有部分消息可用。 (如果它是足够大的消息,它将被分成多个数据包。)解码自己的数据是你的工作。一种简单的方法是添加一个包含一些信息的标题来帮助您,例如消息ID或预期数据大小的指示。通常,带有CRC的页脚可以验证数据的完整性(并确保您有完整的消息)也不会造成伤害。
答案 1 :(得分:1)
TCP是数据流,而不是数据包流。 UDP是数据包流。正如安东尼所说,如果你正在使用TCP,你必须处理一段数据结束而下一段数据开始的地方。