ID: 15976
Updated by: [EMAIL PROTECTED]
Reported By: [EMAIL PROTECTED]
-Status: Feedback
+Status: Closed
-Bug Type: Sockets related
+Bug Type: Documentation problem
Operating System: Win32 (2000) AND Linux2.2
PHP Version: 4.1.2
New Comment:
socket_get_status does not work with sockets from the sockets
extension.
I've updated the docs in CVS.
You need to use something like socket_select() to check
the socket status.
Previous Comments:
------------------------------------------------------------------------
[2002-03-19 13:24:25] [EMAIL PROTECTED]
CVS Date: 2002.03.18 (afternoon EST)
----
socket_get_status has a return value now, but it still is incorrect.
I'm wary of posting code here, because I don't want to present the
image of asking for support, but in fact, socket_get_status is not
returning a proper value.
socket_get_status now complains about invalid file-handle resource
(when the passed resource is a socket resource -- I haven't tried this
with an actual file resource (although, that would seem useless)).
Attached is the code I used to determine this.
S
---
//sock2.php
ob_implicit_flush();
$ip = "localhost";
$port = "10000";
$listenSock = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_nonblock($listenSock);
socket_bind($listenSock, $ip, $port);
socket_listen($listenSock, 0);
$connected = false;
while (!$connected) {
$msgSock = @socket_accept($listenSock);
$connected = is_resource($msgSock);
}
echo "connected...\n";
socket_set_nonblock($msgSock);
for($i=1; $i<=300; $i++) { // ~5 minutes
socket_write($msgSock, ".", 1); // send ".";
echo ".";
$status = socket_get_status($listenSock);
print_r($status);
sleep(1);
}
/*
note: to get the code to break out of the while loop, connect to
localhost on port 10000 (nc[or telnet] localhost 10000) in another
terminal.
*/
---
Here is my terminal log (terminal of the executing sock2.php):
---
sean@adnagaporp:~/php-dev/php4$ ./php -q
~/httpd/site/dev/sockets/sock2.php
connected...
.<br />
<b>Warning</b>: socket_get_status(): supplied resource is not a valid
File-Handle resource in
<b>/home/sean/httpd/site/dev/sockets/sock2.php</b> on line <b>26</b><br
/>
.<br />
<b>Warning</b>: socket_get_status(): supplied resource is not a valid
File-Handle resource in
<b>/home/sean/httpd/site/dev/sockets/sock2.php</b> on line <b>26</b><br
/>
.<br />
(etc...)
---
END
------------------------------------------------------------------------
[2002-03-18 15:27:28] [EMAIL PROTECTED]
PS: Go for the most recent snap you can find, or better
yet, actually check it out from CVS.
--Wez. :-)
------------------------------------------------------------------------
[2002-03-18 15:26:39] [EMAIL PROTECTED]
Could you try this with a current CVS snapshot?
The file/socket layer has been rewritten so this
should be fixed.
------------------------------------------------------------------------
[2002-03-12 21:48:57] [EMAIL PROTECTED]
Oops. Regarding my previous comment:
line 968 reads "what = zend_fetch_resource(socket TSRMLS_CC, -1,
"File-Handle", &type, 1, le_socket);" in CVS, not what I posted
above...
S
------------------------------------------------------------------------
[2002-03-12 21:44:49] [EMAIL PROTECTED]
Alright. So, here's what I've dug up so far:
file: [php]/ext/standard/file.c
line: 968
code: zend_fetch_resource(socket_arg TSRMLS_CC,-1,"Socket
-Handle",NULL,1,php_file_le_socket());
This always line returns false for a valid socket resource (I verified
the resource using `is_resource($sock)` and `get_resource_type($sock)`
for both my listen socket and my message socket.
get_resource_type($sock) returns "Socket".
So, when the next line (969), "ZEND_VERIFY_RESOURCE(what);" is called,
it determines that 'what' is false and calls RETURN_NULL;
I tried screwing with the args in zend_fetch_resource(...), but I don't
know the API well enough (and my C/C++ is more than rusty).
I hope someone takes a look at this soon, I currently have no way of
knowing the status of my sockets (I need to know when a client
disconnects -> eof )
S
------------------------------------------------------------------------
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/15976
--
Edit this bug report at http://bugs.php.net/?id=15976&edit=1