Как мне убедиться, что WinSock отправляет всем клиентам? - PullRequest
1 голос
/ 22 июня 2011

Я написал игру vb6, чтобы 4 игрока могли играть в карточную игру.Один из игроков будет хозяином игры, а остальные присоединятся.

Я использовал массив сокетов, чтобы объединить всех других игроков с хост-сокетом

Все прошло гладко, и я могуотправлять сообщения от каждого игрока остальным игрокам, от хоста к гостям и наоборот

Однако во время игры один игрок "скажет" хосту, что выбрана карта.Затем хост отправит одно и то же сообщение каждому из клиентов, подключенных к массиву сокетов, например

For i=1 to 3
    Me.SocketArray(i).SendData player.selectedCard
    DoEvents
Next

, но по какой-то причине один из игроков так и не получил сообщение.Хотя тот же игрок получал сообщения до этого момента, и, возможно, получит другие сообщения позже.

Таким образом, существует проблема синхронизации с тем, что было отправлено, а что нет.Я всюду искал ответы, и некоторые предлагали использовать DoEvents чаще, чтобы заставить winsock немедленно отправлять данные.

Затем я подумал о создании папки входящих сообщений для каждого игрока, в которой каждый игрок должен ответить сподтверждение полученного сообщения, и хост не будет отправлять больше сообщений до получения подтверждения, но это замедлило игру, и у меня возникла та же проблема, что и раньше, но на этот раз потеряли не сообщения, аподтверждение.

Причина, по которой я думаю, что у меня есть все это, заключается в том, что элемент управления Winsock иногда отправляет неполные сообщения (один символ отсутствует), и это создает беспорядок, поскольку мне нужны все символы на другом концеиначе сообщение бесполезно.

Как я могу убедиться, что всякий раз, когда хост отправляет сообщение, все остальные гости получают ВСЕ его нетронутыми?

1 Ответ

0 голосов
/ 22 июня 2011

Вызовы DoEvents () опасны в чужих руках.

Вероятно, у вас есть предположение о «волшебном» кадрировании сообщений, сбое в буфере и разборе сообщений из входящих потоков данных и повторном входевызывает ваш обработчик DataArrival, потому что вы вызываете DoEvents ().

Nagle также может быть проблемой, но это должно привести к проблемам с отзывчивостью и не к явной потере данных.

Эта же проблема былазадавали вопросы и отвечали бесчисленное количество раз за последнее десятилетие.

...