Autor | Zpráva | ||
---|---|---|---|
nemeja Profil |
Pěkný den,
díky vývoji jedné aplikace jsem se dostal až k socketům - nikdy jsem s nima nepracoval. Tak jsem se rozhodl, že se jim chvilku budu věnovat, abych si je "ošahal". Narazil jsem na problém při čtení zprávy. Zprávu odešlu z clienta na server a server mi hlásí: Warning: socket_read() [function.socket-read]: unable to read from socket [0]: A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied. in C:\wamp\www\socket\server.php on line 29. Což nechápu, jelikož se clientem připojuji a spojení je vytvořené. Zde kod serveru: <?php set_time_limit(0); error_reporting(E_ALL); if($socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)){ echo "Spojení vytvořeno...<br>\n"; } else { echo "Spojení nebylo vytvořeno...<br>\n"; } if(socket_bind($socket,"127.0.0.1",6666)){ echo "Port nabindován...<br>\n"; } else { echo "Nabindování portu se nezdařilo...<br>\n"; } if(socket_listen($socket,5)){ echo "Naslouchání spuštěno...<br>\n"; } else { echo "Naslouchání se nezdařilo...<br>\n"; } while(true){ if(socket_accept($socket)){ if($zprava = socket_read($socket,2048,PHP_NORMAL_READ)){ echo "Socket přijat: $zprava <br>\n" ; } else { echo "Socket chyba:".socket_strerror(socket_last_error($socket)); } exit; } } ?> Klient: <?php error_reporting(E_ALL); if($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)){ echo "Spojení vytvořeno...<br>\n"; if($spojeni = socket_connect($socket,"localhost",6666)){ $zprava = "Ahoj"; if(socket_write($socket, $zprava, strlen($zprava))){ echo "Zprava odeslana...<br>\n"; } else { echo "Zprava nebyla odeslana...<br>\n"; } } else { echo "Nepodařilo se spojit se serverem...<br>\n"; } } else { echo "Spojení nebylo vytvořeno...<br>\n"; } ?> |
||
nemeja Profil |
Pořád se mi to nepodařilo opravit. Je možné, že to nepovoluje Apache? PHP spouštím na W7 a WAMPu.
|
||
juriad Profil |
#3 · Zasláno: 13. 7. 2012, 21:07:12
podle toho co obecně o socketech vím, tak accept vrací nový socket pro každé spojení, kdežto samotný
$socket je jen naslouchací socket
řádek 20: if($accepted = socket_accept($socket)){ $accepted místo $socket
|
||
nemeja Profil |
#4 · Zasláno: 13. 7. 2012, 21:15:08
Taky nefunguje, vyhazuje unable to read from socket [0]: An existing connection was forcibly closed by the remote host.
|
||
juriad Profil |
určitě změna k lepšímu; problém může být v použití read (PHP_NORMAL_READ - reading stops at \n or \r. ), takto nikdy neskončí
zkus binární mód a nebo si pohrát s \n na konci zprávy navíc v if(socket_write($socket, $zprava, strlen($zprava))){ , zapíšeš string bez jakéhokoli terminálu
|
||
nemeja Profil |
#6 · Zasláno: 13. 7. 2012, 21:32:30
Po přepnutí do binárního modu mi to krásně funguje, dík :)
|
||
Časová prodleva: 11 let
|
0