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


No tak. Jak Wy zaczniecie gadac, to dyskusja wedruje do nrPostu^n warstwy OSI, a nie o to pytam.
Datagramy, czy pakiety, za wiki:
Cytat
UDP (ang. User Datagram Protocol – protokół pakietów użytkownika)
... Pakiety UDP, zwane też datagramami ...


Uznajmy to za temat zamkniety.

Dalej, to co wspomnial Zyx o kalkulatorze itd. - tak, duzo literowek i bledow jest w tym poscie ale za cholere nie moge go edytowac.
Do tej pory nawet odpowiedzi nie moglem napisac, bo w polu edycji bylo pelno znakow html, a przy dodawaniu postu bledy - a dokladnie ich lista ... pusta.

Aktualnie mam taki kod:
  1. // 0 - 0xFFFFFFF // 28 bitow, zeby php nie zwariowalo dajac floaty
  2. $packetId = $this->getRandomPacketId(0);
  3. $packet = pack('N4', 0x417, 0x27101980, 0, $packetId);
  4.  
  5. $handle = $this->getHandle();
  6. $this->write($packet);
  7. $response = $this->read(16);
  8.  
  9. $data = unpack('Naction/Npacket/H*cid', $response);
  10.  
  11. if(!$this->hasPacket($data['packet'], $data['action']))
  12. throw new Scrape_Exception
  13. ('Host returned invalid packet ID: '.$data['packet'].':'.$data['action']);
  14.  
  15. // we have obtained our own connection id - save it for further use
  16. $this->connectionId = $data['cid'];


Problem w tym, ze w odpowiedzi connectionId pobieram jako hex-string a nie jako int unsigned 64 bit. Mozna to zrobic inaczej, lepiej ?
Kolejny problem - jezeli read() podaje bez dlugosci, badz z wielkoscia wieksza niz ma otrzymywany pakiet, dostaje error - timeout po 30 sekundach.
Czy rozwiazanie tu bedzie uzycie non-blocking stream / bez buforowania ?
I jeszcze raz - czy istnieje jakis ogolny sposob na pakowanie do danych binarnych liczb 64 bitowych ?
Ja zrobilem to zamieniajac 1 liczbe: 0x41727101980 na 2: 0x417, 0x27101980 i po zakodowaniu parametrem N dostaje dokladnie
taki ciag binarny jaki powinienem (sprawdzone bin2hex).

Polaczenie inicjalizuje:
  1. stream_socket_client($uri, $errNo, $errStr, $this->timeout)

(zaraz ktos znowu przypomni, ze UDP to bezpolaczeniowy protokol ..... )

Odczyt robie tak (i tu mam problem z dlugoscia i timeoutem grr !):

  1. if(is_null($handle))
  2. $handle = $this->handle;
  3.  
  4. $result = stream_get_contents($handle, $length);
  5. if($this->isTimedOut()){
  6. throw new Scrape_Exception
  7. ('Connection timed out while reading stream.');
  8. }
  9. return $result;


isTimedOut() pobiera dane ze stream_get_metadata - tablica z polem timed_out.

Nie rozumiem natomiast o co Erix'owi chodzilo w tym otwieraniu portow UDP ? Huh ?

Ten post edytował azerty 4.03.2011, 01:18:28
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: 30.12.2025 - 17:12