Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Socket połączenie
Forum PHP.pl > Forum > Przedszkole
arkos
Witam, napisałem sobie coś takiego, a dokładniej przepisałem w miarę możliwości - nie znam się za bardzo na C++ do PHP:
  1. $message = 'wyslij wiadomosc';
  2. $ip = '127.0.0.1';
  3. $port = 9000;
  4.  
  5. $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
  6. socket_bind($sock, $ip);
  7. socket_connect($sock, $ip, $port);
  8.  
  9. $len = strlen($message);
  10. $offset = 0;
  11. while ($offset < $len){
  12. $sent = socket_write($sock, substr($message, $offset), $len-$offset);
  13. if ($sent === false){
  14. // Error occurred, break the while loop
  15. break;
  16. }
  17. $offset += $sent;
  18. }

Niestety coś to nie chce działać, nie wiem co tutaj może być źle.

Oryginał w C++ (urywki kodu połączenia):
  1. int sock_connect(char *addr, short port, int msec)
  2. {
  3.  
  4. int sock;
  5. struct hostent *host_ptr;
  6. struct sockaddr_in hostname;
  7.  
  8. #ifdef _WIN32
  9. WSADATA wsa;
  10. WSAStartup(MAKEWORD(2,2),&wsa);
  11. #endif
  12.  
  13. sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  14. if(sock == -1)
  15. return SOCK_ERR_CREATE;
  16.  
  17. host_ptr = gethostbyname(addr);
  18. if(host_ptr == NULL)
  19. {
  20. host_ptr = gethostbyaddr(addr, strlen(addr), AF_INET);
  21. if(host_ptr == NULL)
  22. {
  23. sock_close(&sock);
  24. return SOCK_ERR_RESOLVE;
  25. }
  26. }
  27.  
  28. hostname.sin_family = AF_INET;
  29. hostname.sin_port = htons(port);
  30.  
  31. memcpy(&hostname.sin_addr, host_ptr->h_addr, host_ptr->h_length);
  32.  
  33.  
  34. sock_nonblock(&sock);
  35.  
  36. connect(sock, (struct sockaddr*) &hostname, sizeof(hostname));
  37.  
  38. if(sock_select(&sock, msec, WRITE) <= 0)
  39. {
  40. sock_close(&sock);
  41. return SOCK_TIMEOUT;
  42. }
  43.  
  44. if(!sock_isvalid(&sock))
  45. {
  46. sock_close(&sock);
  47. return SOCK_INVALID;
  48. }
  49.  
  50. return sock;
  51. }
  52.  
  53.  
  54. int sock_send(int *s, char *buf, int len, int msec)
  55. {
  56. int rc;
  57. int sent = 0;
  58. int error;
  59.  
  60. while(sent < len)
  61. {
  62. rc = sock_select(s, 60000, WRITE); //check if socket is connected
  63. if(rc == 0)
  64. {
  65. printf("select returned 0\n");
  66. fflush(stdout);
  67. return SOCK_TIMEOUT;
  68. }
  69.  
  70. if(rc == -1)
  71. {
  72. printf("select returned -1\n");
  73. fflush(stdout);
  74. return SOCK_TIMEOUT;
  75. }
  76.  
  77. if((rc = send(*s, buf+sent, len-sent, 0)) < 0)
  78. {
  79. error = errno;
  80. if(error != EWOULDBLOCK)
  81. {
  82. printf("send errno: %d\n", error);
  83. fflush(stdout);
  84. return SOCK_TIMEOUT;
  85. }
  86. rc = 0;
  87. }
  88.  
  89. sent += rc;
  90. }
  91. return sent;
  92. }


Pozdrawiam i liczę na pomoc.

smile.gif
untorched
Włącz obsługę błędów i podaj błąd który zwraca lub ewentualnie jak nie zwraca błędu to co się dzieje lub nie dzieje.
CuteOne
Zobacz tutaj

tylko podmień
  1. $ready = socket_select($read,$write = NULL, $except = NULL, $tv_sec = NULL);

na
  1. $write = $except = $tv_sec = null;
  2. $ready = socket_select($read,$write, $except, $tv_sec);

arkos
Tylko mnie nie chodzi o stworzenie serwera i klienta socket w PHP.
Mam pewną aplikację, która już jest serwerem socket i nasłuchuje na porcie 9000, a z poziomu PHP chcę się z nią właśnie połączyć (przez socket) i wysłać wiadomość.
CuteOne
manual -> fsockopen()
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.