![]() |
|
|
|
|
#1
|
|||
|
|||
|
Чесной народ подскажите как можно в Делфях пропарсить UDP пакет, так чтобы информация что внем была читаемая. Вот его структура
Поле Длина, байт Описание FLAG 1 Флаг начала пакета, FLAG=0x40 PROTOCOL 1 Идентификатор протокола, схема шифрования ADDRESS 2 Младшая часть адреса источника пакета LENGTH 2 Длина поля CDATA CRC16 2 Контрольная сумма поля CDATA CDATA переменная Данные/команды (определяется PID) |
|
#2
|
|||
|
|||
|
А ты как его получаешь?
Вообще - пишется струтура, делается на нее указатель, потом этот указатель "накладывается" на область памяти с данными. Код:
type
TUDPPacket = record
FLAG : Byte;
PROTOCOL : Byte;
ADDRESS : Word;
LENGTH : Word;
CRC16 : Word;
CDATA : Array [] Of Byte;
end;
PUDPPacket = ^TUDPPacket;
...
var
Packet : Pointer;
UDPPacket : PUDPPacket;
begin
Packet := GetPacket(); // типа получили данные
UDPPacket := PUDPPacket(Packet);
ShowMessage('Protocol : ' + IntToStr(UDPPacket^.PROTOCOL));
end;PS. не уверен с полем CDATA. Надо смотреть подробнее. |
|
#3
|
|||
|
|||
|
Эт все хорошо, но где находиться GetPacket(), а то чтот немогу найти.
|
|
#4
|
||||
|
||||
|
Так вам-же задали вопрос, как вы эти данные получаете. За неимением ответа была предложена абстрактная функция которую вы сами должны наваять.
|
|
#5
|
|||
|
|||
|
Получаю пакет с помощью
Код:
//===================================
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: STRING;
i:integer;
begin
DataStringStream:=TStringStream.Create('');
try
DataStringStream.CopyFrom(AData, AData.Size);
for i:=0 to Adata.Size do
begin
s:=DataStringStream.DataString;
Memo1.Lines.Add(s[i]);
end;
finally
DataStringStream.Free;
end;
StatusBar1.Panels.Items[0].Text:='Отправитель IP: ' + ABinding.PeerIP;
StatusBar1.Panels.Items[1].Text:='Получатель IP: ' + ABinding.IP;
Memo1.Lines.SaveToFile('d.log');
end;
//===============================================lmikle: ползуемся тегами!!! |
|
#6
|
|||
|
|||
|
Возьми не TStringStream, а TMemoryStream. Там можно получить указатель на память типа Pointer - именно то, что нужно для моего кода.
|