Старый добрый 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. по поводу инжект длл. если реь идет про используемый в пакетхаке то код там мудренный но ничего "специальносделаного чтобы остальные непоняли или не скомпилили" там нет.
так же инжект просто перенавравляет соединение требуемого приложения на локальный сервер. тобишь на заранее открытый твоей программой серверный сокет. никакого чтения и отправки данных касаемо траффика там нет. все в самом пакетхаке.