Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie danych z telnetu więcej niż 8192b długo pobiera
Forum PHP.pl > Forum > PHP
rafaliex
Witam,

Potrzebuję pobierać sporo danych z urządzenia dokładnie switcha i rozmiar pobieranych danych przekracza 8192b. Wiem że fread może pobierać max 8192b dlatego próbuję zrobić pętle na fread i wtedy pobiera mi całe dane lecz pobranie reszty danych trwa bardzo długo...

Mój kod wygląda tak:

  1. $fps=@fsockopen($ip,23);
  2. fputs($fps,$header1);
  3. usleep(200000);
  4. fputs($fps,$header2);
  5. usleep(300000);
  6. fputs($fps,"$login\r\n");
  7. usleep(300000);
  8. fputs($fps,"$haslo\r\n");
  9. usleep(600000);
  10. fputs($fps,"show fdb\r\n");
  11. usleep(300000);
  12.  
  13. fputs($fps,"a");
  14. usleep(300000);
  15.  
  16.  
  17. while ($info = fread($fps,8192)) {
  18. $x .= $info;
  19. }
  20.  
  21. echo $x;


Gdy robię to bez pętli czyli tylko jedno pobranie 8192b to jest ok szybko to się ładuje, ale jak już robi się pętla to tak naprawdę 1.5x więcej danych niż 8192b potrafi trwać minutę.
Nie wiem czy ja coś robię źle ale próbowałem też tą pętle zastąpić $x = stream_get_contents($fps, -1); i to też podobnie trwa.

Ma ktoś jakiś pomysł na mój problem??

dla przykładu pobranie stringa: string(13653) trwa dokładnie 1 minutę.
Pyton_000
Zerknij to: https://github.com/ngharo/Random-PHP-Classe...elnet.class.php
rafaliex
Próbowałem użyć tej klasy ale ona jest napisania typowo pod jakieś logowanie do serwera gdzie są znaki charakterystyczne. Wolałbym bazować na czymś innym.
Pyton_000
a jesteś pewny że nie idzie tam się zalogować po ssh ? Co to za switch?
rafaliex
Ogólnie to nie będzie jeden rodzaj switcha. A tak naprawdę 4 rodzaje ale problem w tym że wszystkie switche mają zablokowane ssh, mają tylko telnet uruchomiony. I przy wszystkich switach paczkę danych 9182b pobiera w ciągu 2 sekund a resztę bardzo bardzo długo.
Pyton_000
zerknij jeszcze to https://github.com/fijiwebdesign/php-telnet
rafaliex
Użyłem czegoś innego
socket_connect
socket_send
socket_recv

Te same dane wyciaga mi w 5 sekund, dzięki za pomoc.

Teraz mam inny problem, gdy łącze się z jednym ze switchy i próbuje się zalogować to ciągle mam znaczek:
"ÿý"
Jak dodam handshake:
$header1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).chr(0x20).chr(0xF
F).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).chr(0x27).chr(0xFF).chr(0xFD).chr(0x01
).chr(0xFF).chr(0xFB).chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC)
.chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).chr(0x1F).chr(0x00).
chr(0x50).chr(0x00).chr(0x18).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).c
hr(0x00).chr(0x33).chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).ch
r(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr
(0x27).chr(0x00).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(
0x41).chr(0x4E).chr(0x53).chr(0x49).chr(0xFF).chr(0xF0);


to wtedy komunikat zwrotny jest większy:
ÿýÿþÿþ ÿþ'ÿûÿýÿûÿúÿð


Mój kod wygląda teraz tak:
  1. $header1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x41).chr(0x4E).chr(0x53).chr(0x49).chr(0xFF).chr(0xF0);
  2. $header2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);
  3.  
  4. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
  5. socket_connect($sock , $ip , 23);
  6. sleep(4);
  7.  
  8. $message = $header1;
  9. socket_send ( $sock , $message , strlen($message) , 0);
  10. sleep(4);
  11. $message = "admin \r\n";
  12. socket_send ( $sock , $message , strlen($message) , 0);
  13. sleep(4);
  14.  
  15. socket_recv ( $sock , $x , 800000 , MSG_WAITALL );


I na wszystkich urządzeniach działa a na jednym innym modelu nie działa takie wysyłanie danych. Ma ktoś jakiś pomysł co trzeba zrobić by ta komunikacja zadziałała?? Próbowałem z sleep by poczekać na serwer ale nic nie chce zwrócić.
mls
Poczytaj o stream_set_blocking.
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-2024 Invision Power Services, Inc.