Форум сайта python.su
Уважаемые форумчане, подскажите, пожалуйста, что делать.
Я использую этот класс для подключения к серверу Call of Duty 4 (движок игры ведет родословную от Q3). Все работает прекрасно, вот только есть одна проблема: если на сервере играет много человек, то ответ сервера на команду status где-то обрезается :( Строка получается очень длинной.
По этой же ссылке, в комментариях, вы найдете вывод команд python codrcon.py и python codrcon.py | wc -m. Видно, что в девятой строчке таблица внезапно обрывается. И вне зависимотсти от содержания таблицы, она получается на 1288 символов. Как уже отмечалось выше, если игроков мало (например, пять), то все работает прекрасно: таблица уменьшается в это количество символов.
Не могли бы вы, пожалуйста, подсказать, где же этот чертов пакет урезается? :(
Офлайн
Дело в том, что сокеты имеют свой размер буфера и посылают данные порциями. Раньше вам везло и данные вмещались в одну порцию, а если данных уже больше, они передадутся, но не за один раз, а за несколько. В вашем случае перед parse_packet вам надо иметь промежуточный свой буфер, в который вы будете складывать пришедшие данные. Как только придут все данные (хотябы один целый пакет) можно их вытаскивать из буфера и анализировать.
Офлайн
Точно, работает :) Но… В зависимости от онлайна на сервере данные приходят в одном, двух или трех пакетах. Первое, что пришло в голову - это загнать recv в цикл с условием выхода data = None. Но тогда возникает неприятная ситуация - приходится выжидать таймаут.
Может, есть более рациональное решение?
В любом случае, спасибо за ответ.
Офлайн
Ну так в каждую итерацию цикла проверять целый ли пакет уже собрался.
Офлайн