2010-12-28 3 views
2

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

ответ

0

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

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

+0

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

Смежные вопросы