ID: 21197 Comment by: susenjit_c at hotmail dot com Reported By: bool at boolsite dot net Status: Open Bug Type: Sockets related Operating System: win32 only PHP Version: 5.*, 4.* New Comment:
Hello all, socket_read() is working fine omitting the third parameter PHP_NORMAL_READ. I am using php 5.0.4 in WinXP with Apache 2.0.54. Server code is same as example given in online document with minor modification. Using CLI the code works fine. I have written a small client and run it from browser which sends text message to the server. This also working fine. The only problem I am having now is that I can't run the server code using browser cause its hanging and using telnet client I can only send single character. For this reason in my server code I have taken '9' for Quit and '0' for Shutdown. Part of the code goes as - <?php /* Same as example code in the document and then */ $msg = "\nWelcome to the PHP Test Server. \n"; $msg .= "To quit, type '9'. To shut down the server type '0'.\n"; socket_write($msgsock, $msg, strlen($msg)); do { if (false === ($buf = socket_read($msgsock, 2048))) { /*, PHP_NORMAL_READ*/ echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n"; break 2; } if ($buf == '9') { $msg1 = "\nLoging out. \n Thanks for using the server"; socket_write($msgsock, $msg1, strlen($msg)); break; } if ($buf == '0') { $msg1 = "\nServer is shuting down. Thanks."; socket_write($msgsock, $msg1, strlen($msg)); socket_close($msgsock); break 2; } $talkback = "\tHOST : You said " .$buf. "\n"; socket_write($msgsock, $talkback, strlen($talkback)); echo "$buf\n"; } while (true); echo "Closing client.\n"; socket_close($msgsock); } while (true); socket_close($sock); ?> Susen Previous Comments: ------------------------------------------------------------------------ [2005-07-23 19:34:13] temposeb at free dot fr Configuration : PHP 5.1.0b3 (CLI), Win2000 SP4. I make my first steps in network dev / sockets and I encounter the same problem. A simpler complete test case using PHP-CLI instead of the unreadable sample given sooner. I want simply connect the client to the "server" and send the msg "Hello server !" that will be displayed on the server's console... server.php ========================================================= <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) ; socket_bind($socket, '127.0.0.1', 4567) ; socket_listen($socket) ; $client = socket_accept($socket) ; echo socket_read($client, 256, PHP_NORMAL_READ) ; // Line 7 socket_close($client) ; socket_close($socket) ; ?> ========================================================= client.php ========================================================= <?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) ; socket_connect($socket, '127.0.0.1', 4567) ; socket_write($socket, "Hello server !\r\n") ; socket_close($socket) ; ?> ========================================================= So, I launch server.php then client.php, result on server console : ========================================================= PHP Warning: socket_read(): unable to read from socket [0]: Opération réussie. in C:\dev\PHP\mines\server.php on line 7 Warning: socket_read(): unable to read from socket [0]: Opération réussie. in C:\dev\PHP\mines\server.php on line 7 ========================================================= Same thing with PHP_BINARY_READ or no 3rd parameter specified : socket_read( ) returns FALSE and warn us. No error on client console. Note that all *seems* OK when I use the following server.php : ========================================================= <?php $socket = stream_socket_server('tcp://127.0.0.1:4567') ; $client = stream_socket_accept($socket) ; echo fgets($client) ; // Outputs "Hello server !" fclose($client) ; fclose($socket) ; ?> ========================================================= So, how should we consider socket extension ? Should we forget it for stream_*( ) and f*( ) functions ? Thx :) ------------------------------------------------------------------------ [2004-03-11 11:06:02] [EMAIL PROTECTED] I've compilled PHP with cygwin/gcc and no error is produced. However, the build version from snaps.php.net gives that error. ------------------------------------------------------------------------ [2003-08-26 02:00:58] bool at boolsite dot net Ok, this is a short example : (a little echo server) <?php error_reporting(E_ALL); $Port=6669; if(($Sock=socket_create(AF_INET,SOCK_STREAM,0))<=0) { echo 'socket_create() a échoué : ',socket_strerror(socket_last_error($Sock)),"\r\n"; exit; } if(($Ret=socket_bind($Sock,0,$Port))<=0) { echo 'socket_bind() a échoué : ',socket_strerror(socket_last_error($Ret)),"\r\n"; exit; } if(($Ret=socket_listen($Sock,5))<=0) { echo 'socket_listen() a échoué : ',socket_strerror(socket_last_error($Ret)),"\r\n"; exit; } while(true){ $MsgSock=socket_accept($Sock); if($MsgSock===false) { echo 'socket_accept() a échoué : ',socket_strerror(socket_last_error($MsgSock)),"\r\n"; break; } else { echo '=> Debut de la connexion...',"\r\n"; $EndTime=time()+15; do{ $buffer=socket_read($MsgSock,1024,PHP_NORMAL_READ); if($buffer===false) { echo 'socket_read() a échoué : ',socket_strerror(socket_last_error($MsgSock)),"\r\n"; break; } elseif(!$buffer){ continue; } $buffer=trim($buffer); echo '< ',$buffer,"\r\n"; if($buffer=='quit') { break; } $back='You sent : ['.$buffer.']'; echo '> ',$back,"\r\n"; socket_write($MsgSock,$back."\r\n"); } while(time()<$EndTime); @socket_close($MsgSock); echo '=> End...',"\r\n"; } } socket_close($Sock); ?> ------------------------------------------------------------------------ [2002-12-26 20:39:22] [EMAIL PROTECTED] If you omit the third parameter to socket_read() it seems to work fine. However, adding PHP_NORMAL_READ causes error as described in the bug report. ------------------------------------------------------------------------ [2002-12-26 09:32:25] bool at boolsite dot net Hello I have a source which works with PHP 4.1.x to PHP 4.2.x, it's work perfectly. But with PHP 4.3RC4 (windows version, client mode) I have this warning : Warning: socket_read() unable to read from socket [0]: OpÚration rÚussie. in E:\PHP\KioobFTP\v0.7.1\KioobFTP_SocketMode.php on line 262 Then, the result of the function is FALSE. The socket is in blocking mode. The code is : $tmp=socket_read($this->stream,4096,PHP_NORMAL_READ); Do you need others info ? Thanks. Bool ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=21197&edit=1