ID: 28141
Updated by: [EMAIL PROTECTED]
Reported By: php at richardneill dot org
-Status: Open
+Status: Feedback
Bug Type: Sockets related
Operating System: Linux
PHP Version: 5.0.0RC1
New Comment:
I cannot reproduce the problem with latest PHP5. Can you provide a
*full* reproducing case.
My scripts are :
server:
<?php
error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();
$address = '127.0.0.1';
$port = 4322;
if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
echo "socket_create() failed: reason: " . socket_strerror($sock) .
"\n";
}
if (($ret = socket_bind($sock, $address, $port)) < 0) {
echo "socket_bind() failed: reason: " . socket_strerror($ret) .
"\n";
}
if (($ret = socket_listen($sock, 5)) < 0) {
echo "socket_listen() failed: reason: " . socket_strerror($ret) .
"\n";
}
do {
if (($msgsock = socket_accept($sock)) < 0) {
echo "socket_accept() failed: reason: " .
socket_strerror($msgsock) . "\n";
break;
}
$buffer=socket_read($msgsock,2048,PHP_NORMAL_READ);
$buffer2=socket_read($msgsock,2048,PHP_NORMAL_READ);
var_dump($buffer, $buffer2);
if ($buffer===false){
echo "Error: socket_read() failed: reason:
".socket_strerror(socket_last_error())." \n";
break;
} else if ($buffer=='') {
echo "Socket $socket returned an empty string. Closing
connection\n";
socket_close($socket);
} else {
echo "Received data".trim($buffer)."\n";
}
socket_close($msgsock);
} while (true);
socket_close($sock);
?>
client:
<?php
error_reporting(E_ALL);
echo "TCP/IP Connection\n";
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket < 0) {
echo "socket_create() failed: reason:
".socket_strerror($socket)."\n";
} else {
echo "OK.\n";
}
echo "Attempting to connect to '127.0.0.1' on port '4322'...";
$result = socket_connect($socket, "127.0.0.1", 4322);
if ($result < 0) {
echo "socket_connect() failed.\nReason: ($result)
".socket_strerror($result) . "\n";
} else {
echo "OK.\n";
}
$s = "ALA\n";
socket_write($socket, $s);
echo "Closing socket...";sleep(5);
socket_close($socket);
echo "OK.\n\n";
?>
Previous Comments:
------------------------------------------------------------------------
[2004-04-28 04:54:43] php at richardneill dot org
This is still present in RC2
------------------------------------------------------------------------
[2004-04-25 06:56:24] php at richardneill dot org
Description:
------------
According to the documentation, socket_read() can return:
1)A string - normal data
2)An empty string "" - the other end closed the connection
3)false - something went wrong.
But it seems to be returning false on connection close.
Reproduce code:
---------------
$buffer=socket_read($socket,2048,PHP_NORMAL_READ);
if ($buffer===false){
echo "Error: socket_read() failed: reason:
".socket_strerror(socket_last_error())." \n";
exit (1);
}elseif ($buffer==''){
echo "Socket $socket returned an empty string. Closing
connection\n";
socket_close($socket);
}else{
echo "Received data".trim($buffer)."\n";
}
Expected result:
----------------
I'm using netcat as a client, and then killing the netcat process with
Ctrl-C to simulate remote host disconnecting.
I expect to see the socket close.
Actual result:
--------------
Actually, the php script exits, because socket_read returns
false instead of "".
This may be a bug in the documentation for socket_read, rather than in
its behaviour.
Thanks for your help - Richard
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=28141&edit=1