Odbieranie Pakietu UDP

0

Witam

Mam pytanko.
Chce odebrać pakiet przychodzący po UDP.
Jedyne co wiem o tym pakiecie to to że jego wielkosc wynosi 102 bajty.
Chce skorzystać z komponentu ICS WSocket albo z INDY.

Udało mi się odebrać wielkość Pakietu poniższą procedurką(ICS):

 procedure TUDPMainForm.WSocket1DataAvailable(Sender: TObject;
  ErrCode: Word);
  var
  buf:array[1..1024] of byte;
  biciki:Integer;
  begin

    if ErrCode <> 0 then exit;

   biciki:=Wsocket1.Receive(@buf, sizeof(buf));
   UDPmemo.Lines.Add('Bytes:' + inttostr(biciki));
   end;

Niestety nie mam pomysłu jak wyciągnąc string z danymi pakietu.
Próbowałem skorzystać z ReceiveStr przy wlaczonym trybie LineMode := TRUE;
ale niestety nic do Memo nie chce mi się wbić.

Proszę o podpowiedz w powyższym temacie...

Pozdrawiam

0

w buf masz przeca to co odebrałeś - co z tym zrobisz - jedynie wyobraźnia cię ogranicza - możesz nawet bajt po bajcie konwertować na znak i dodawać do memo

BTW nurtuje mnie jedna rzecz - od czego ta nazwa zmiennej biciki???

0

biciki -> bajciki tak z czapy równie dobrze mogłobyć s : integer ;)
Sorka ale jestem mocno ciemny w temacie. Na codzień tylko php.

Byłem święcie przekonany że poniższy kod wyrzuci mi do memo wlasnie moj string z odebranymi danym w formie tablicy bajtow z buf : array ...

biciki:=Wsocket1.Receive(@buf, sizeof(buf));
UDPmemo.Lines.Add('Bytes:' + inttostr(biciki));

Natomiast on wyrzucił do memo liczbę bajtów => 102 i tak za każdym pakietem.

Wydaje mi się że parametr Receive po prostu sam w sobie zwraca wlasnie zfetchowana liczbę bajtow

Proszę o fragment kodowej podpowiedzi jak wyciągnąc z tablicy buf : array... wszystkie przechwycone dane pakietu i wyświetlić je w memo (UDPmemo)

Pozdrawiam

0

Receive to nie parametr tylko metoda, a dane masz w zmiennej buf. A jak to zamienić - google tell you

0

Spróbuj UDPmemo.Lines.Add(string(buf));

0

Nie działa:
Spróbuj UDPmemo.Lines.Add(string(buf));

Dzięki misiekD:

Przeanalizowałem kilka liknków i doszedłem do czegoś takiego:

 procedure TUDPMainForm.WSocket1DataAvailable(Sender: TObject;
  ErrCode: Word);
  var
  result: array of char;
  i : integer;
  buf: array[0..1024] of byte;
  begin

    if ErrCode <> 0 then exit;
    Wsocket1.Receive(@buf, sizeof(buf));


    SetLength(Result, Length(buf));
    for i := 0 to Length(buf)-1 do
    UDPmemo.Lines.Add(AnsiChar(buf[i]));

   end;

EFEKT DZIAŁANIA:

g
Ś
Š
E
(
ˇ

Ă



?
˙

?
˙
á
O

?
˙

?
˙

;
U
Ş
®
Ő
Ş


ţ
Ő
Ŕ

?
˙

?
˙
E
"
'
¨
W
ľ
A

t

š
T
!


ł

ţ
Q

?
˙




?
˙
š

k

To samo widać przy podglądzie paczki Winsharkiem/

Co prawda programik odbiera już jakieś ASCI znaki ale zastanawia mnie jak odebrać to w postaci bitów, tak aby można było przy użyciu odpowiedniego "klucza" zdekodować pakiet.

Pozdrawiam
0
  1. naprawdę, nie złośliwie, zajmij się podstawami podstaw bo masz bardzo duże braki.
  2. Receive zwraca ile tak naprawdę odebrał bajtów więc powinno być tak
procedure TUDPMainForm.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
var
  i: integer;
  buf: array[0..1024] of byte;
  recCount: Integer;
begin
  if ErrCode <> 0 then 
    exit;
  recCount := Wsocket1.Receive(@buf, sizeof(buf));
 
  for i := 0 to recCount - 1 do
    UDPmemo.Lines.Add(AnsiChar(buf[i]));
 end;
  1. buf: array[0..1024] of byte; czyli tablica bajtów - buf[i] to i-ty bajt paczki. Co do bitów to poczytaj z czego składa się bajt i jak 'rozbić' bajt na bity
0

Proponuje

var
result: String;
cnt: integer;
buf: array[0..1024] of byte;
begin

if ErrCode <> 0 then exit;
cnt := Wsocket1.Receive(@buf, sizeof(buf));
UDPmemo.Lines.Add( Copy(PAnsiChar(@buf[0]), 1, cnt) );

end;

jesli chcesz sie dostac np do 1 bitu danej wartosci to if buf[n] and $80 = $80 then .....

0

Dzięki, Temat do zamknięcia...

1 użytkowników online, w tym zalogowanych: 0, gości: 1