Показать сообщение отдельно
Старый 21.03.2009, 14:27   #50
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Старый добрый TclientSocket - и большинство вопросов подымаемых тут просто бы не задавалось.
Цитата:
У них вообще нет этих функций , нету ни Read ни Write , ни Send , ни Recieve , как с пакетами то работать?
хы.
ClientSocket1.Socket.SendBuf(blabla, blablabla); = отправка
в эвентах прием. а именно. в OnRead
чтото вроде
Socket.ReceiveBuf(blablabla, Socket.ReceiveLength);

вот к примеру. по самой компоненте
кстати. один из самопальных трюков, возможно пригодится -)
delphi Код:
procedure TForm1.ClientSocket1Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); begin ErrorCode := 0; Socket.Close; end;
зы.
delphi Код:
IdTCPClient1.ReadBuffer(size, 2); SetLength(pck, size-2); IdTCPClient1.ReadBuffer(pck[1], size-2);//ты уже 2 байта в сайз считал.. куда тебя понесло полный пакет тянуть ?! Memo1.Lines.Add(StringToHex(pck,' '));

не забудь склеить сайз и само тело пакета.

зы2
в идеале чтото вроде

delphi Код:
var   Buff: array [0..65535] of AnsiChar;   len : Word; begin   //читаем длину пакета 2 байта поэтому это Word, 0..65535   IdTCPClient1.ReadBuffer(@len, 2);   //впихиваем это дело в буффер   CopyMemory(@Buff[0], @len, 2);   //читаем остаток пакета запихивая в буфер начиная с 3го байта   IdTCPClient1.ReadBuffer(@Buff[2], len - 2);   //готово. в массиве Buff у нас наш полученный пакет.   Memo1.Lines.Add(Format('получен пакет длинной %d, hex:'#10#13' %s', [len, ByteToHexStr(@Buff[0], len)]); end;
на правильность синтаксиса и работоспособность кода не претендую. ибо не проверял.

зы3. я использую следующий байттохекс
delphi Код:
function ByteToHexStr(Data: Pointer; Len: Integer): String; var   I, Octets, PartOctets: Integer;   DumpData: String; begin   if Len = 0 then Exit;   I := 0;   Octets := 0;   PartOctets := 0;   Result := '';   while I < Len do   begin     case PartOctets of       0: Result := Result + Format('%.4d: ', [Octets]);       9:       begin         Inc(Octets, 10);         PartOctets := -1;         Result := Result + '    ' + DumpData + sLineBreak;         DumpData := '';       end;     else       begin         Result := Result + Format('%s ', [IntToHex(TByteArray(Data^)[i], 2)]);         if TByteArray(Data^)[i] in [$19..$FF] then           DumpData := DumpData + Chr(TByteArray(Data^)[i])         else           DumpData := DumpData + '.';         Inc(I);       end;     end;     Inc(PartOctets);   end;   if PartOctets <> 0 then   begin     PartOctets := (8 - Length(DumpData)) * 3;     Inc(PartOctets, 4);     Result := Result + StringOfChar(' ', PartOctets) +       DumpData   end; end;

зы4.
прием оформляйте в нитях, не забывайте что читать вы должны с сокета ровно столько сколько там есть. в противном случае висяки обеспечены

Добавлено через 26 минут
2 Amorality. по поводу инжект длл. если реь идет про используемый в пакетхаке то код там мудренный но ничего "специальносделаного чтобы остальные непоняли или не скомпилили" там нет.
так же инжект просто перенавравляет соединение требуемого приложения на локальный сервер. тобишь на заранее открытый твоей программой серверный сокет. никакого чтения и отправки данных касаемо траффика там нет. все в самом пакетхаке.

Последний раз редактировалось alexteam, 21.03.2009 в 14:50. Причина: Добавлено сообщение
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился 2 спасибками от: