ID: 21197
Updated by: [EMAIL PROTECTED]
Reported By: bool at boolsite dot net
Status: Open
Bug Type: Sockets related
Operating System: *
PHP Version: 5.*, 4.* (2005-10-29) (snap)
New Comment:
Here's a possible patch, but Wez probably knows better if there's a way
to tell if a windows socket is in blocking mode...
Index: sockets.c
===================================================================
RCS file: /repository/php-src/ext/sockets/sockets.c,v
retrieving revision 1.171.2.2
diff -u -p -d -r1.171.2.2 sockets.c
--- sockets.c 3 Nov 2005 15:00:51 -0000 1.171.2.2
+++ sockets.c 4 Nov 2005 18:28:45 -0000
@@ -257,6 +257,12 @@ static int php_read(int bsd_socket, void
int nonblock = 0;
char *t = (char *) buf;
+/*
+ * fcntl(s, F_GETFL) will always fail for windows, and there's no way
to
+ * determine if a socket is in blocking mode to my current knowledge,
so we
+ * just omit this check; though that means we're always blocking on
win32...
+ */
+#ifndef PHP_WIN32
m = fcntl(bsd_socket, F_GETFL);
if (m < 0) {
return m;
@@ -264,6 +270,7 @@ static int php_read(int bsd_socket, void
nonblock = (m & O_NONBLOCK);
m = 0;
+#endif
set_errno(0);
Previous Comments:
------------------------------------------------------------------------
[2005-11-04 16:24:47] [EMAIL PROTECTED]
See also bug #35062
------------------------------------------------------------------------
[2005-09-29 16:07:34] tommyo at gmail dot com
I installed the latest windows build PHP Version 5.1.0RC2-dev and the
socket problem still exists. I get:
Warning: socket_read() [function.socket-read]: unable to read from
socket [0]: The operation completed successfully.
When I put PHP_NORMAL_READ for the read type parameter. Using the
default or PHP_BINARY_READ works just fine for the same line of code.
------------------------------------------------------------------------
[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.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
http://bugs.php.net/21197
--
Edit this bug report at http://bugs.php.net/?id=21197&edit=1