Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie danych z socketa
Forum PHP.pl > Forum > PHP
Yacho
Mamy sobie taką klasę (koncepcja zmieniona) :
  1. <?php
  2. class nntp // main class
  3. {
  4. var $server;
  5. var $port;
  6. var $timeout;
  7. var $newsgroup;
  8.  
  9. function nntp()
  10. {
  11. $this->serwer = '193.110.122.97';
  12. $this->port = 119;
  13. $this->timeout = 5;
  14. $this->newsgroup = 'pl.internet.komunikaty';
  15. }
  16.  
  17.  
  18. function connect()
  19. {
  20.  
  21. $this->link = fsockopen($this->serwer, $this->port, $errno, $errstr, $this->timeout) or die ('NNTP server connection failed: Error '. $errno .' : ' . $errstr);
  22. }
  23.  
  24. function sendData($dataString) // Sends command via previously open socket
  25. {
  26.  
  27. if(!$this->link) // bails out if no connection was made earlier...
  28. {
  29. die("Can't send data ! no connection estabilished !");
  30. }
  31. else
  32. {
  33. fwrite($this->link, "$dataString.rn") or die('Could not send data !');
  34.  
  35. if(preg_match( '/^[1-5]{1}[0-9]{2}/', fgets( $this->link ) ) )
  36. {
  37. while(preg_match( '/^[1-5]{1}[0-9]{2}/', fgets( $this->link ) ))
  38. {
  39. echo 'true';
  40. $output .= fgets( $this->link );
  41. }
  42. }
  43. else 
  44. {
  45. while(fgets( $this->link ) != ".rn")
  46. {
  47. $output .= fgets( $this->link );
  48. }
  49. }
  50.  }
  51.  return $output;  
  52.  
  53. }
  54.  
  55.  
  56.  
  57.  
  58. function disconnect() //closes connection
  59. {
  60. fclose($this->link);
  61. }
  62.  
  63. function setNewsGroup()
  64. {
  65. $this->sendData("GROUP $this->newsgroup");
  66. }
  67.  
  68.  
  69. }
  70.  
  71. ?>

Obiekt jest inicjalizowany tak :
  1. <?php
  2. // initializes and uses nntp_class.php
  3. require('nntp_class.php');
  4.  
  5. $nntp = new nntp();
  6.  
  7. echo $nntp->connect();
  8.  
  9. echo 'break<br/>';
  10. echo $nntp->sendData("GROUP pl.internet.komunikaty");
  11. $nntp->disconnect();
  12. ?>



chodzi konkretnie o metode sendData() a jeszcze konkretniej o pobierany przez nia wynik dzialania komendy.... wynik moze byc dwojakiego typu :

- typ status - kazda linia z tego typu komunikatu zaczyna sie od 3 cyfrowego kodu komunikatu a konczy znakiem nowej linii i powrotu karetki.
- typ tekst : komunikat w tym typie moze miec wiele linii z czego ostatnia - sygnalizujaca koniec komunikatu to znak kropki nowej linii i powrotu karetki - tu kody statusu nie wystepuja....

Problem jest w tym ze wydanie polecenia :

  1. <?php
  2. $obiekt->sendData("komenda_jaka_tylko_chcesz"); // w powyzszym przykladzie komendą jest GROUP pl.internet.komunikaty
  3. ?>

Powoduje wykonywanie sie skryptu w nieskonczonosc....
Patrzalem juz na wszystko co sie da i nadal nic...

dla porownania ta sama komenda wydana przez telnet bez problemu zwraca takie cos :
Kod
GROUP pl.internet.komunikaty
211 239 4880 5268 pl.internet.komunikaty

Wiec tak jak powinno - zaczynajac sie od kodu 211.... Prosze o Pomoc bo siedze od 3 dni juz nad tym i miekne....
mls
Pomyśl nad tymi linijkami:
  1. <?php
  2. if(preg_match( '/^[1-5]{1}[0-9]{2}/', fgets( $this->link ) ) )
  3. {
  4. while(preg_match( '/^[1-5]{1}[0-9]{2}/', fgets( $this->link ) ))
  5. {
  6. echo 'true';
  7. $output .= fgets( $this->link );
  8. }
  9. }
  10. ?>


Co chcesz pobierać przez fgets(), jeśli serwer już np. nic nie zwraca? Skrypt wówczas mimo to czeka, aż coś od serwera dostanie. Zainteresuj się feof() smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.