Найти - Пользователи
Полная версия: Обрезание длинной строки при передаче через сокет.
Начало » Network » Обрезание длинной строки при передаче через сокет.
1
Ulltor
Уважаемые форумчане, подскажите, пожалуйста, что делать.
Я использую этот класс для подключения к серверу Call of Duty 4 (движок игры ведет родословную от Q3). Все работает прекрасно, вот только есть одна проблема: если на сервере играет много человек, то ответ сервера на команду status где-то обрезается :( Строка получается очень длинной.

По этой же ссылке, в комментариях, вы найдете вывод команд python codrcon.py и python codrcon.py | wc -m. Видно, что в девятой строчке таблица внезапно обрывается. И вне зависимотсти от содержания таблицы, она получается на 1288 символов. Как уже отмечалось выше, если игроков мало (например, пять), то все работает прекрасно: таблица уменьшается в это количество символов.

Не могли бы вы, пожалуйста, подсказать, где же этот чертов пакет урезается? :(
poltergeist
Дело в том, что сокеты имеют свой размер буфера и посылают данные порциями. Раньше вам везло и данные вмещались в одну порцию, а если данных уже больше, они передадутся, но не за один раз, а за несколько. В вашем случае перед parse_packet вам надо иметь промежуточный свой буфер, в который вы будете складывать пришедшие данные. Как только придут все данные (хотябы один целый пакет) можно их вытаскивать из буфера и анализировать.
Ulltor
Точно, работает :) Но… В зависимости от онлайна на сервере данные приходят в одном, двух или трех пакетах. Первое, что пришло в голову - это загнать recv в цикл с условием выхода data = None. Но тогда возникает неприятная ситуация - приходится выжидать таймаут.
Может, есть более рациональное решение?
В любом случае, спасибо за ответ.
ZZZ
Ну так в каждую итерацию цикла проверять целый ли пакет уже собрался.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB