Решил побаловаться и для своих нужд создать что-то типа ООГ бота. Мучился, маялся, в итоге смог зайти в игру и отправить EnterWorld. А вот дальше, вроде казалось бы уже ничего препятствовать не должно было, ан нет, появилась проблемка.... Вполне возможно, что проблема очень легко решаема, но все же решил спросить, может кто знает в чем дело точно.
Итак....
После отправки EnterWorld у меня содержимое пакетов от сервера слишком большое, причем, как правило каждый новый пакет больше предыдущего размерами. Иногда первый после EnterWorld отображается нормально, а следующий уже начинает ерозить нечто непонятное, а иногда и даже первый пакет после EnterWorld уже какой-то корявый.
- Пакеты я смотрел прям с того момента, как их получал от сервера
- Бот мой стоит в гиране, т.е. поток пакетов достаточно большой, в других местах, где поток пакетов меньше не тестил (не успеваю, интернет фиг знает когда будет).
- Когда перехватываю своего бота L2phx-ом, то тот спокойно все показывает
- Когда юзал снифер пакетов (Wireshark), то там тоже пакеты от сервера были корявые, кроме первого (как и в моем боте)
- Сам бот вообще написан путем подправки выложенного негде тут парсера Логин-пакетов L2EmuSrc (не помню только кто выкладывал), в котором принцип работы с сокетами мной совершенно не был изменен
Если что-то забыл сказать, что нужно для того что бы мне можно было помочь - скажите - напишу.
Кто нибудь знает что это за ерезь?
P.S. У меня есть лишь одно объяснение всему этому - мой бот просто тупо не успевает обрабатывать пакеты и поэтому они накладываются друг на друга оО. Или же может это особенности работы с сервером, о которых я не знаю? Но я думаю врятли сервер будет присылать пакеты размером с 11 тыс. байт....
Последний раз редактировалось Kilatif, 14.07.2011 в 21:19.
supernewbie, нет, дело совсем не в этом, ибо 1) я же дошел уже до EnterWorld. 2) Я написал, что анализирую пакеты сразу после того как их получаю и там уже сразу они слишком большие.
xkor, вот WMSOCK_RS_EVENT, в котором я принимаю пакеты (прошу не обращать внимания на всякие тупости, связанные с RecvPktCount и numpck, ибо это лишь тестовая версия ):
Код:
procedure TForm1.WMSOCK_RS_EVENT(var Msg: TMessage);
var
SockError: integer;
Len:integer;
s : string;
begin
//проверка на ошибки
SockError:=WSAGetSelectError(Msg.lParam);
if (SockError<>0) then begin
if SockError=10053 then RichEdit1.Lines.Add('RS was Disconnected')
else RichEdit1.Lines.Add('RS error: '+inttostr(SockError));
CloseSock(RS_sock);
Exit;
end;
//если нет ошибок:
case WSAGetSelectEvent(Msg.lParam) of
FD_Read: begin
FillChar(main_buff,Length(main_buff),0);
Len:=recv(RS_Sock,main_buff,MAX_PKT_SIZE,0);
s := IntToStr(numpck) + '.txt';
numpck := numpck + 1;
if numpck > 100 then numpck := 101;
// SaveBuf(s, len);
inc(RecvPktCount);
if RecvPktCount > 13 then RecvPktCount := 14;
if RecvPktCount <= 4
then LS_parser(main_buff,Len)
else GS_parser(main_buff,Len);
end;
FD_Close: begin
RichEdit1.Lines.Add('RS was Disconnected');
CloseSocket(RS_Sock);
end;
end;
end;
Собственно из этого всего главная строка:
Len:=recv(RS_Sock,main_buff,MAX_PKT_SIZE,0);
и вот main_buff (main_buff: array[0..MAX_PKT_SIZE-1] of byte) у меня и заполняется до 11 или 16 кбайт
Вот, кстати, лог пакетов с моей программы (первых 2 после EnterWorld, а точнее 1 и лишь маленький кусок второго).
Пакеты декодированы:
Как видно, в моей проге первый пакет показывает нормально, второй пакет в принципе тоже, а вот третий как-то накладывается на второй, причем в нем уже не найти начало, то ли я вообще хз...
Последний раз редактировалось Kilatif, 15.07.2011 в 23:30.
Kilatif, не вижу в процедуре приема контроля длины пакета. Где ты проверяешь сколько реально байт считано с сокета, совсем не обязательно в буфере приема будет весь пакет? Думаю что проблема начинается при приеме первого большого пакета который нужно считывать с сокета более чем за 1 прием.
Yegor, Ну как бы у меня все пакеты помещаются в мой буфер вполне нормально. Пакеты всегда приходят разной длинны, а не какой-то предположительно максимально фиксированной (т.е. например у меня буфер на 16 кб, а приходит всегда фиксировано 14 кб, т.е. сокет обрезает как-то, нет, такого нет). Ну и если проанализировать даже вот те логи, которые я скинул, то видно, что вроде как после той части, что я выделил жирным цветом (это в l2phx полностью второй пакет) сразу должно быть C8 00 - размер следующего пакета, а там не понятно что....
Kilatif,уверен что первый пакет принят полностью? Дело не в размере буфера а в том что интернет имеет задержки, и пакеты могут доставляться за несколько приемов даже весьма небольшого размера.
1.Не вижу отдельно приема первых 2х байт из буфера чтобы узнать реальную длину пакета.
2.Почему из буфера пытаешься прочитать сразу все содержимое?
Len:=recv(RS_Sock,main_buff,MAX_PKT_SIZE,0);
В буфере может быть сразу несколько пакетов.
В любом случае для безошибочного приема пакета необходимо сначала считывать его длину (первых 2 байта), а затем читать с сокета до той поры пока эта (длина - 2 байта) не будет принята полностью (в твоем случае если пакет принят не полностью то необходимо ожидать следующего евента).
В любом случае для безошибочного приема пакета необходимо сначала считывать его длину (первых 2 байта), а затем читать с сокета до той поры пока эта (длина - 2 байта)
на логин сервере тоже 2 байта длинна идет вначале? или только на гейм?
Yegor, хорошо... свои ошибки в приеме пакета в сокете я понял. Но или я тебя понял не до конца или ты меня не понял, но... Если ты говоришь, что несколько пакетов может придти за раз, то почему в моем втором принятом пакете после куска правильного (жирным цветом выделено) не начинается 3ий пакет (пусть и в зашифрованном виде)? Ведь это на мой взгляд было бы логично. Т.е. там сразу после выделенного жирным ведь по логике должно идти первых два байта размера третьего пакета, но там этого вовсе нет.
Добавлено через 1 минуту supernewbie, да и на логин тоже первых 2 байта это размер пакета.
Последний раз редактировалось Kilatif, 16.07.2011 в 10:59.
Причина: Добавлено сообщение
хм, можно тада тыкнуть пальцем где в l2clientemu при парсе пакетов логин серва идет взятие инфы о длинне из этих двух байтов?
Добавлено через 2 минуты
там по ходу игнорируют два байта длинны да, копируя сразу с третьего байта и полагаясь на размер того что было в буфере, хм, интересно как он вообще тогда работает если в буфере может быть не один пакет
__________________ Начало.
Последний раз редактировалось supernewbie, 16.07.2011 в 12:37.
Причина: Добавлено сообщение