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
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
Chodzi mi o to, jak mam podac dane.
Struktura pakietu jest dosyć jasno wytłumaczona. Jako treść wiadomości musisz podać zmienną zawierającą w sobie zlepek różnych danych (do zlepienia danych musisz wykorzystać pack).
Pamiętaj, że w PHP liczby całkowite (int) mogą być 32 lub 64 bitowe, tak więc powinieneś to mieć na uwadze. W przypadku, gdy masz 64-bitowy PHP, a protokół wymaga podania danych 32-bitowych musisz pozbyć się początkowych 32 bitów. W przypadku gdy masz 32-bitowy PHP, a protokół wymaga podania 64-biotwej liczby musisz spakować dwie zmienne w jedną - ponownie: pack.

Cytat
wytlumaczyl mi krok 1 - "obtain connection id"
Jest to losowa 32-biotwa liczba, która pozwala Ci identyfikować kolejne pakiety, w skrócie robisz coś takiego:

  1. $id1 = mt_rand(0, 0xFFFFFFFF);
  2.  
  3. // wysyłasz pakiet (zawiera on pow. id)
  4.  
  5. // ....
  6.  
  7. $packet = // odbierasz pakiet
  8. if ($packet->getId() == $id1) {
  9. // odebrany pakiet jest odpowiedzią na ten wysłany tuż wcześniej
  10. }
  11.  
  12.  
  13. // Ponownie generujesz identyfikator
  14. $id2 = mt_rand(0, 0xFFFFFFFF);
  15.  
  16. // wysyłasz pakiet (zawiera on pow. id)
  17.  
  18. // ....
  19.  
  20. $packet = // odbierasz pakiet
  21. if ($packet->getId() == $id2) {
  22. // odebrany pakiet jest odpowiedzią na ten wysłany tuż wcześniej, a nie ten z samego początku
  23. }
Pamiętaj, że UDP to protokół który nie gwarantuje praktycznie niczego - dotyczy to również kolejności w jakiej dochodzą pakiety (pakiet wysłany później może dojść wcześniej).
Cytat
oraz jak odebrane dane przekonwertowac z postaci binarnej do np. tablicy.
Działanie odwrotne od pakowania danych do binarnego stringu - czyli unpack

EDIT:
Cytat
Nie moge uzmyslowic sobie co to jest offset - zakladam, ze jest to n-ty bajt w ciagu ?
Offset jest tam podany w bajtach (czyli offset = 8 oznacza "od 64 bitu"). Tutaj masz przykład struktury pakietu wysyłanego w protokole TCP: http://en.wikipedia.org/wiki/Transmission_...gment_structure - myślę, że to dobrze obrazuje o co chodzi.

Ten post edytował Crozin 2.03.2011, 16:45:03
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: 10.10.2025 - 22:34