我写了一个vb6游戏,允许4名玩家玩纸牌游戏。 其中一名球员将主持比赛,其他球员将加入比赛。
我使用套接字阵列将所有其他玩家与主机套接字
连接起来一切顺利,我能够将每个玩家的消息发送给其他玩家,从主人到客人,反之亦然
然而,在游戏过程中,一名玩家会“告诉”主人选择了一张牌。然后,主机将向连接到套接字阵列的每个客户端发送相同的消息,如此
For i=1 to 3
Me.SocketArray(i).SendData player.selectedCard
DoEvents
Next
但由于某种原因,其中一个玩家从未收到该消息。虽然同一个播放器在此之前确实收到了消息,但稍后可能会收到其他消息。
因此发送和不发送的内容存在同步问题。
我到处寻找答案,有些人建议更频繁地使用DoEvents
强制winsock立即发送数据。
然后我考虑为每个玩家实施一个收件箱,其中每个玩家必须回复确认收到的消息,并且主机在确认到达之前不会再发送任何消息,但这会让游戏变得更慢而且我我遇到了同样的问题,但这次不是丢失的消息,而是确认。
我认为我拥有这一切的第一个原因是Winsock控件有时会发送不完整的消息(缺少一个字符)并且会造成混乱,因为我需要另一端的每个字符,否则消息是无用的。
如何确保每当主持人发送消息时,所有其他来宾都会完整地收到所有消息?
答案 0 :(得分:0)
DoEvents()调用在坏人手中是危险的。
您可能正在进行的是假设“魔术”消息框架,无法缓冲和解析来自入站数据流的消息,以及重新调用DataArrival处理程序,因为您正在调用DoEvents()。
Nagle也可能是一个问题,但它应该导致响应问题,而不是明显的数据丢失。
在过去十年中,同样的问题已经被问到并回答了无数次。