ну, вызывать то оно и не должно. переменная явно не в защищенной памяти так как считаеться во время вызова. но и толку от такого изменения тоже нет. результат не запишеться магическим образом обратно.. а уничтожиться оптимизатором по прыжку в стеке на уровень вверх.
В предыдущих версиях быда опция: "Пропускать логин - программа начинает работать после соединения с Game-Сервером". Кто подскажет для чего это? Из кода ниже тоже непонятно что оно делает .
delphi Код:
//пропускать логин?//если (пропускать логин и мы не в игре)if isPassLogin and(not IsGamel)thenbegin//отсылаем данные, сначала длину, а потом сам пакет
send(CSockl,PacketB, 2, 0);
repeatuntil send(CSockl, PacketB, recv(SSockl, PacketB, $FFFF, 0), 0)<=0;
endelsebegin//иначе (пропускать логин и мы в игре)//прием пакетовrepeatifnot GetSocketData(SSockl, Packet.DataB, Packet.Size-2)thenbreak;
if IsGamel
then PacketProcesor(PacketB, CSockl, id, 4)else PacketProcesor(PacketB, CSockl, id, 2);
ifnot GetSocketData(SSockl, Packet, 2)thenbreak;
//sendMSG('size: '+IntToStr(Packet.Size));untilFalse;
end;
Такое ощушение что изначально должна была быть возможность залогиниваться с помошью PH, но это так и не было реализовано.
Добавлено через 1 час 28 минут
И ещё просветите зачем функция:
delphi Код:
function GetSocketData(Socket: TSocket; var Data; const Size: Word): Boolean;
var
Position: Word;
Len: Integer;
DataB: array[0..$5000] ofByte absolute Data;
begin
Result:=False;
Position:=0;
while Position<Size dobegin
Len:=recv(Socket,DataB[Position],1,0);
if Len<=0thenExit;
Inc(Position, Len);
end;
Result:=True;
end;
Я как понял она с помошью "recv" считывает нужное количество байт с сокета по 1 байту. Почему так сделали? Что случится если попытаться сразу считать необходимое кол-во байт одним махом.
зы: прошу прощения за обилие вопросов, приспичило разобраться с программой.
Последний раз редактировалось Yegor, 03.05.2009 в 05:10.
Причина: Добавлено сообщение
Хотя зачем то же было сделано по 1 байту. Я так понял эта функция пытаеться считать не больше size байт с сокета но если данных будет меньше то цикл завершиться раньше:
if Len<=0 then Exit;
Последний раз редактировалось Yegor, 03.05.2009 в 12:46.
Все что считывает эта функция за 1 вызов можно считать одним пакетом или необходимо как то вручную их разделать?
Киньте пожайлуста ссылкой на тему где описана структура пакетов Л2.
Все с логикой передачи приема пакетов разобрался. Пробовал считывать с сокета ровно столько сколько на него перешло и передавать сразу на 2ой сокет - не работает. Действительно приходиться читать сначала первые 2 байта (длину пакета) и считывать именно это количество байт.
Попутно вопрос. Почему на некоторых серверах (ГГ там нет), если внедрить inject - то даже после ввода логина и пароля клиент зависает, хотя ПХ пищет что этот коннект проигнорирован? Такое ощущение что клиент уже шлет в никуда и не получает ответ.