Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 14.01.2010, 23:05   #1
Пользователь
 
Аватар для mOBSCENE
 
Регистрация: 07.01.2008
Сообщений: 39
Сказал Спасибо: 11
Имеет 3 спасибок в 3 сообщенях
mOBSCENE
По умолчанию Как грамотно разлепить пакеты?

Есть библиотека внедряемая в волкер при запуске и ставящая перехват на connect, send и recv.
C send проблем никаких волкер шлет пакеты по одному с шифрованием проблем никаких.
Вот с recv проблемко, первый раз я расклеивание сделал таким образом при приходе пакета начинается цикл где по одному вытягиваются пакеты по считыванию из первых 2-х байт пакеты размера каждого и по одному расшифровываются и обрабатываются и копируются в другой отведенный для этого буфер, но проблема часто возникает с последним, он частенько проходит не до конца или половина или начало когда как..), я додумался только сделать так, сохранять это начало и ждать следующего пакета чтобы прочитать собственно эту радость до конца и уже добавлять этот кусочек уже к началу новоприбывшего пакета.
На первом сервере на который первый раз писалась эта библиотека было все на удивлению нормально. На днях переделал ее на другой серв, и начались проблемы, ненаю или сервер творчески любит нарезать пакеты, что иногда моя глупая нарезалка тут не справляется, погоду происходит некислое переполнение буфера волкера и он отказывается работать до перезапуска.

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

PS: сори за грамотейство.
__________________
Блекджек же без шлюх практически безопасен.
mOBSCENE вне форума   Ответить с цитированием
Старый 15.01.2010, 00:03   #2
Новичок
 
Регистрация: 07.01.2010
Сообщений: 13
Сказал Спасибо: 3
Имеет 0 спасибок в 0 сообщенях
Smith пока неопределено
По умолчанию

как вариант, отдельным потоком получать пакеты в два этапа (сначала размер потом сам пакет) и складывать в буфер который уже скармливать боту
Smith вне форума   Ответить с цитированием
Старый 15.01.2010, 01:22   #3
Местный
 
Регистрация: 08.05.2008
Сообщений: 107
Сказал Спасибо: 6
Имеет 12 спасибок в 6 сообщенях
finomen пока неопределено
По умолчанию

про потоки-дельное замечание. а вот боту буфер кормить не надо. пакеты надо обрабатывать на лету. получили->обработали->отдали идем за следующим. поскольку протокол асинхронный - 2 потока: 1 Client->Server, второй Server->Client
finomen вне форума   Ответить с цитированием
Старый 15.01.2010, 16:58   #4
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

finomen, счтываешь из сокета всё что там есть в буфер, далее извлекаешь по одному из буфера все целые пакеты и удаляешь их из буфера, опять считываешь всё из сокета и добавляешь в буфер, опять извлекаешь все целые пакеты, ну и так далее)
так я делаю в своих последних программах, в пакетхаке у меня было сделано по другому, написал обёртку к recv которая вызывала recv, далее если recv прочем данных меньше чем запрашивалось то снова вызывала её в цикле пока не было прочитано всех данных...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 16.01.2010, 15:11   #5
Новичок
 
Регистрация: 07.01.2010
Сообщений: 13
Сказал Спасибо: 3
Имеет 0 спасибок в 0 сообщенях
Smith пока неопределено
По умолчанию

Цитата:
Сообщение от xkor Посмотреть сообщение
finomen, счтываешь из сокета всё что там есть в буфер, далее извлекаешь по одному из буфера все целые пакеты и удаляешь их из буфера, опять считываешь всё из сокета и добавляешь в буфер, опять извлекаешь все целые пакеты, ну и так далее)
А как тогда с пакетами у которых начало только пришло, а конец в следующем буфере? Ведь при добавлении следующего буфера начало затрется и пакет потеряется, если это начало сохранять то получается как у автора схема. Или я чего то не так понял?

ЗЫ xkor можно исходник этой обработки...
Smith вне форума   Ответить с цитированием
Старый 16.01.2010, 16:37   #6
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

delphi Код:
procedure TConnection.WriteBuf(var buf; const size: Integer); var   i: Integer; begin   if size<=0 then Exit;   i:=Length(fBuf);   SetLength(fBuf,i+size);   Move(buf,fBuf[i+1],size);   ParseBuf; end; procedure TConnection.ParseBuf; var   pck: PFixPck; begin   pck:=@fBuf[1];   while(Length(fBuf)>=2)and(Length(fBuf)>=pck.size)do begin    try     if pck.size<2 then pck.size:=2;     if isLogin then fBF.bfDecode(pck.id,pck.size-2)                else fCrypt.DecryptGP(pck.id,pck.size-2)                ;     ParsePck(pck); // обработка пакета    finally     Delete(fBuf,1,pck.size);     pck:=@fBuf[1]; // может и не надо но не помешает...    end;   end; end;
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
За это сообщение xkor нажился 2 спасибками от:
Старый 05.02.2010, 23:00   #7
Пользователь
 
Аватар для mOBSCENE
 
Регистрация: 07.01.2008
Сообщений: 39
Сказал Спасибо: 11
Имеет 3 спасибок в 3 сообщенях
mOBSCENE
По умолчанию

Пришлось отказаться от перехвата send и recv и сделать по нормальному на прослойке сервера и клиента на неблокирующем сокете на событиях, а принцип разлепливания пакетов оставил тот же практически, не дошедший пакет накапливается в буфере, как придет до конца, потом обрабатывается и скармливает волкеру частями по 550h.
Работает зараза на удивление не плохо.))
__________________
Блекджек же без шлюх практически безопасен.
mOBSCENE вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:15.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!