Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Network
  • » Обрезание длинной строки при передаче через сокет. [RSS Feed]

#1 Май 5, 2009 07:23:16

Ulltor
От:
Зарегистрирован: 2009-05-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Обрезание длинной строки при передаче через сокет.

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

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

Не могли бы вы, пожалуйста, подсказать, где же этот чертов пакет урезается? :(



Офлайн

#2 Май 5, 2009 08:19:40

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

Обрезание длинной строки при передаче через сокет.

Дело в том, что сокеты имеют свой размер буфера и посылают данные порциями. Раньше вам везло и данные вмещались в одну порцию, а если данных уже больше, они передадутся, но не за один раз, а за несколько. В вашем случае перед parse_packet вам надо иметь промежуточный свой буфер, в который вы будете складывать пришедшие данные. Как только придут все данные (хотябы один целый пакет) можно их вытаскивать из буфера и анализировать.



Офлайн

#3 Май 5, 2009 08:57:34

Ulltor
От:
Зарегистрирован: 2009-05-05
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Обрезание длинной строки при передаче через сокет.

Точно, работает :) Но… В зависимости от онлайна на сервере данные приходят в одном, двух или трех пакетах. Первое, что пришло в голову - это загнать recv в цикл с условием выхода data = None. Но тогда возникает неприятная ситуация - приходится выжидать таймаут.
Может, есть более рациональное решение?
В любом случае, спасибо за ответ.



Офлайн

#4 Май 5, 2009 13:49:01

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Обрезание длинной строки при передаче через сокет.

Ну так в каждую итерацию цикла проверять целый ли пакет уже собрался.



Офлайн

  • Начало
  • » Network
  • » Обрезание длинной строки при передаче через сокет.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version