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%)
-----


Dochodzi 3:00 więc wybacz za formę i ewentualne błędy. (IMG:style_emoticons/default/wink.gif)

Cytat
Problem w tym, ze w odpowiedzi connectionId pobieram jako hex-string a nie jako int unsigned 64 bit. Mozna to zrobic inaczej, lepiej ?
Upewnij się, że tekst (w formie 16-owej) ma dokładnie 16 znaków. Jeżeli ma mniej dopełnij go zerami, czyli "d50abc0bcaedf" -> "000d50abc0bcaedf". Podziel go na dwa teksty równej długości - teraz każdy reprezentuje liczbę 32-biotwą. Wykorzystując hexdec możesz zamienić to na rzeczywistą liczbę.
PHP nie gwarantuje obsługi liczb 64-bitowych, więc bezpieczniej jest trzymać je jako dwie niezależne 32-bitowe zmienne.

Cytat
Kolejny problem - jezeli read() podaje bez dlugosci, badz z wielkoscia wieksza niz ma otrzymywany pakiet, dostaje error - timeout po 30 sekundach.
Mówisz "chcę otrzymać od Ciebie 50 jabłek", więc oczywistym jest, że nie przyjdę do Ciebie mając ich tylko 40, co nie? (IMG:style_emoticons/default/smile.gif) Przede wszystkim nie powinieneś żądać więcej niż się spodziewasz - przecież masz w tej specyfikacji podane ile konkretnie bajtów zostanie przesłane.


Na Twoim miejscu na początku poszukałbym / napisałbym chociażby najbardziej prymitywnej biblioteki do tworzenia "paczek" o konkretnej (binarnej) zawartości, udostępniającej jakieś sensowne API do odczytu / zapisu danych bo Cie szlag trafi z tym packiem i unpackiem. Nie mówiąc już, że podatność na błędy takiego kodu jest ogromna.
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: 14.10.2025 - 00:39