Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Komunikacja z protokolem UDP, Jak stworzyc pakiet ?
azerty
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 2.03.2011

Ostrzeżenie: (0%)
-----


Czesc.

Mam dokumentacje protokolu opartego o UDP:
http://xbtt.sourceforge.net/udp_tracker_protocol.html

... i nie bardzo wiem jak to ugryzc. Chodzi mi o to, jak mam podac dane. Nie moge uzmyslowic sobie co to jest offset - zakladam, ze jest to n-ty bajt w ciagu ?

  1. $transId = 1234567;
  2. $binString = pack('I@8I@12I@16', 0x41727101980, 0, $transId);
  3.  
  4. $fp = stream_socket_client($uri, $errNo, $errStr, $timeout);
  5. stream_set_timeout($fp, $timeout);
  6.  
  7. if (!$fp) {
  8. echo "ERROR: $errNo - $errStr<br />\n";
  9. }else{
  10. fwrite($fp, $binString);
  11. $r = fgets($fp, 1024);
  12. var_dump($r);
  13. echo 'ok';
  14. fclose($fp);
  15. }


Gdyby ktos byl tak mily, i wytlumaczyl mi krok 1 - "obtain connection id" oraz jak odebrane dane przekonwertowac z postaci binarnej do np. tablicy.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
azerty
post
Post #2





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 2.03.2011

Ostrzeżenie: (0%)
-----


Dzieki, pomoglo.
Pogoooglowalem i ... :

32 bitowa liczba posiada 4 oktety (4*8 = 32).
64 bitowa liczba ma owych oktetów 8 (8*8 = 64).

Offset w pakiecie to numer oktetu po ktorym doklejamy kolejne dane.

I tak:

Kod
0    64-bit integer    connection_id    0x41727101980
8    32-bit integer    action    0
12    32-bit integer    transaction_id
16


(Liczymy od zera, tak jak w tablicach)
Od 0 do 7 - osiem oktetow, liczba 64 bitowa
8 - 11 cztery oktety liczby 32 bitowej
12 - 15 kolejne cztery oktety.

Dla pozostalych, ktorzy tez poszerzaja wiedze na ten temat - oktet to np: 1001 1001 1001 1001 1001 1001 1001 1001, razem 32 bity.
Kazda cyfra w HEX (szesnastkowa, 0 - F) reprezentuje 4 bity.
I tak: 1001 = 0x9 a ten dlugi ciag wczesniej: 0x99999999.

Mam 32 bitowa wersje PHP wiec 64-bitowa liczba 0x41727101980 (8 znakow - za duzo na 32 bit - max to 8) nie bedzie dzialac, rozdzielam ja wiec na dwie 32-bitowe:
0x417, 0x27101980 (po prostu rozdzielam, nie robie zadnych dzialan matematycznych).

Nastepnie pakujemy dane. W specyfikacji pisze, ze liczby sa w formacie big endian (najwazniejszy bajt pierwszy (bajt = 8 bitow (oktet))).
Nalezy wziac to pod uwage przy funkcji PACK:

  1. $transId = mt_rand(0, 0xFFFFFF);
  2. $binString = pack('N4', 0x41727, 0x101980, 0, $transId);


Wyjasnienie "N3" - N oznacza, ze pierwszy parametr powinien zostac zakodowany jako:
unsigned long (always 32 bit, big endian byte order)
"4" oznacza, ze nalezy zastosowac to do 4 kolejnych argumentow zaczynajac od aktualnego.
2 pierwsze argumenty to nasz podzielony, 64 bitowy integer, ktorego moje php nie ogarnia :-)

Ok i pozniej lecimy:

  1. $fp = stream_socket_client($uri, $errNo, $errStr, $timeout);
  2. stream_set_timeout($fp, $timeout);
  3.  
  4. if (!$fp) {
  5. echo "ERROR: $errNo - $errStr<br />\n";
  6. }else{
  7. fwrite($fp, $binString);
  8. $r = fread($fp, 255); // oczekiwane 16
  9. var_dump($r);
  10. fclose($fp);
  11. }


... i kupa. fwrite zwraca 16, czyli jest GIT. $fp jest OK - polaczenia nawiazane, var dump z fread natomiast zwraca string o zerowej dlugosci. Nie dostaje zadnej odpowiedzi.

Bede dalej probowal, natomiast tych bardziej doswiadczonych prosil bym o ewentualne sugestie. Moze jest cos o czym nie wiem. Wg. dokumentacji powinienem teraz dostac odpowiedz o dlugosci min. 16 bajtow.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 11:25