Odbieranie Pakietu UDP

Odpowiedz Nowy wątek
2011-07-07 15:31
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

Pozostało 580 znaków

2011-07-07 15:53
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???


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij
edytowany 1x, ostatnio: Misiekd, 2011-07-07 15:53

Pozostało 580 znaków

2011-07-07 20:35
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

edytowany 1x, ostatnio: tomek_p, 2011-07-07 20:39

Pozostało 580 znaków

2011-07-07 22:33
0

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


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-07-07 22:41
0

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

Pozostało 580 znaków

2011-07-08 10:12
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
Chodzi Ci o funkcję 'Ord'? - Patryk27 2011-07-08 10:28

Pozostało 580 znaków

2011-07-08 10:37
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;
  3. 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

- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2011-07-08 11:00
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 .....

Pozostało 580 znaków

2011-07-08 12:07
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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