![]() |
|
|
#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 - именно то, что нужно для моего кода.
|