Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][sockets]-lokalnie dziala, na serwerze nie
Forum PHP.pl > Forum > Przedszkole
kazimi
Witam.
Jestem poczatkujacy w php. Zamierzam uruchomic sobie skrypt dzialajacy jak prosty serwer, ktory odsyla to, co odbierze. Zainstalowalem sobie WAMPSERVER, i lokalnie mi to dziala. Probuje to odpalic na normalnym serwerze, ale otrzymuja bledy:


Warning: socket_bind() [function.socket-bind]: unable to bind address [99]: Cannot assign requested address in /home/users/kazek/public_html/index.php on line 15

Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [4]: Interrupted system call in /home/users/kazek/public_html/index.php on line 22

Warning: socket_write() expects parameter 1 to be resource, boolean given in /home/users/kazek/public_html/index.php on line 29

Warning: socket_read() expects parameter 1 to be resource, boolean given in /home/users/kazek/public_html/index.php on line 31

Po czym blad 31 powtarza sie.

Kod znalazlem w manualu:

  1. #!/usr/local/bin/php -q
  2. <?php
  3. /*pierwsza linia w tym pliku to sciezka do interpretera*/
  4. /* Allow the script to hang around waiting for connections. */
  5. /* Turn on implicit output flushing so we see what we’re getting
  6. * as it comes in. */
  7. $address = '10.5.5.3 ';
  8. $port = 80;
  9. if (($sock = socket_create (AF_INET, SOCK_STREAM, 0)) < 0) {
  10. echo "socket_create() failed: reason: " . socket_strerror ($sock) . "\n";
  11. }
  12. if (($ret = socket_bind ($sock, $address, $port)) < 0) {
  13. echo "socket_bind() failed: reason: " . socket_strerror ($ret) . "\n";
  14. }
  15. if (($ret = socket_listen ($sock, 5)) < 0) {
  16. echo "socket_listen() failed: reason: " . socket_strerror ($ret) . "\n";
  17. }
  18. do {
  19. if (($msgsock = socket_accept($sock)) < 0) {
  20. echo "socket_accept() failed: reason: " . socket_strerror ($msgsock) . "\n";
  21. break;
  22. }
  23. /* Send instructions. */
  24. $msg = "\nWelcome to the PHP Test Server. \n" .
  25. "To quit, type 'quit'. To shut down the server type 'shutdown'.\n";
  26. socket_write($msgsock, $msg, strlen($msg));
  27. do {
  28. if (FALSE === ($buf = socket_read ($msgsock, 2048))) {
  29. echo "socket_read() failed: reason: " . socket_strerror ($ret) . "\n";
  30. break 2;
  31. }
  32. if (!$buf = trim ($buf)) {
  33. continue;
  34. }
  35. if ($buf =='quit') {
  36. break;
  37. }
  38. if ($buf == 'shutdown') {
  39. socket_close ($msgsock);
  40. break 2;
  41. }
  42. $talkback = "PHP: You said '$buf'.\n";
  43. socket_write ($msgsock, $talkback, strlen ($talkback));
  44. echo "$buf\n";
  45. } while (true);
  46. socket_close ($msgsock);
  47. } while (true);
  48. socket_close ($sock);
  49. ?>


Juz w momencie pisania postu jestem swiadom, ze prawdopodobnie nie dostarczam wszystkich potrzebnych wiadomosci do rozwiazania tego problemu. Postaram sie uscislic, jak bede wiedzial, co. Bede wdzieczny za jakiekolwiek porady.

Pozdrawiam
mls
  1. $address = '10.5.5.3';

Taki adres nie istnieje na serwerze, najwidoczniej. Prościej jest użyć jako wartości albo '0' albo null lub w ogóle skorzystać z socket_create_listen.
kazimi
mls dzieki, pomoglo. Pojawil sie mianowicie nastepny problem:

socket_bind() [function.socket-bind]: unable to bind address [98]: Address already in use in /home/users/kazek/public_html/index.php on line 15

Wiem, ze nie moge uzywac adresow ponizej 1024, bo wymaga to odpalenia apacha pod rootem. Wiec wybieram jakikolwiek inny port. Mimo ze jest ich sporo to ciezko jest mi cos trafic na wlasciwy. W jaki sposob sprawdzic, ktore porty sa wolne? No bo jezeli sobie wybiore jakis na sztywno, to moze pozniej sie okazac, ze jakis inny uzytkowinik serwera mi go zajmie?

Gdy juz trafilem na wolny port, dostaje:


Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [4]: Interrupted system call in /home/users/kazek/public_html/index.php on line 22

Warning: socket_write() expects parameter 1 to be resource, boolean given in /home/users/kazek/public_html/index.php on line 29

Warning: socket_read() expects parameter 1 to be resource, boolean given in /home/users/kazek/public_html/index.php on line 31

Jeszcze jedno zapytanie przy okazji. Odpalilem phpinfo() na tym serwerze.

SERVER_ADDR 10.5.5.3
SERVER_PORT 80


REMOTE_ADDR 93.233.73.41
REMOTE_PORT 38709

Jaka jest roznica pomiedzy powyzszymi wartosciami. Ktorych z nich i kiedy nalezy uzywac?
mls
Na unixowych systemach możesz sprawdzić które porty są aktualnie używane konsolowym poleceniem netstat (w wyniku interesuje Cię przede wszystkim kolumna "Local Addresses").
Przed zaakceptowaniem połączenia zaleca się najpierw wybrać te, które przesłały jakieś dane - służy do tego socket_select. Poza tym, socket_accept może zwrócić null (zamiast false) w przypadku błędnego połączenia.
Różnica pomiędzy SERVER_* a REMOTE_* jest taka, że pierwsze dane dotyczą serwera na którym działa skrypt zaś drugie - komputera klienta (czyli Twojego) który jest zdalnie z serwerem połączony.
erix
A uwzględniłeś fakt, że może być na serwerze firewall?
kazimi
A jak sprawdzic, czy na serwerze jest firewall?

Niestety, caly czas dostaje:

Warning: socket_accept() [function.socket-accept]: unable to accept incoming connection [4]: Interrupted system call in /home/users/kazek/public_html/index.php on line 24
Could not accept incoming connection



OK.
W takim razie zapytam inaczej. W czym generalnie mozna postawic taki prosty serwer? Chcialbym to miec wspolistniejace z prosciutka strona www i mala baza w sql. Nie prosze o zrobienie tego za mnie, tylko o jakies naprowadzenie. Bede wdzieczny za kazda sugestie.
Pozdrawiam
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.