WSAECONNABORTED при использовании recv во второй раз - PullRequest
2 голосов
/ 29 декабря 2010

Я пишу многопользовательскую 2D-игру, состоящую из двух приложений, консольного сервера и оконного клиента.Пока что у клиента есть FD_SET, который заполнен подключенными клиентами, списком моих указателей игровых объектов и некоторыми другими вещами.В main () я инициализирую прослушивание на сокете и создаю три потока, один для принятия входящих соединений и помещения их в FD_SET, другой для обработки местоположения объектов, скорости и ускорения и пометки их (при необходимости) как текоторые должны быть обновлены на клиенте.Третий поток использует функцию send () для отправки информации об обновлении каждого объекта (итерации по списку указателей объектов).Такой пакет состоит из кода операции, размера пакета и фактических данных.На клиенте я анализирую его, читая первые 5 байтов (код операции и размер пакета), которые получены правильно, но когда я хочу прочитать оставшуюся часть пакета (так как теперь я знаю его размер), я получаюWSAECONNABORTED (код ошибки 10053).Я читал об этой ошибке, но не могу понять, почему она возникает в моем приложении.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 29 декабря 2010

Ошибка означает, что система закрыла сокет.Это может быть связано с тем, что он обнаружил, что клиент отключился, или потому, что он отправлял больше данных, чем вы читали.

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

...