Bug #15976 Updated: socket_get_status(...) returns nothing
| From: | sean at caedmon dot net | Date: | Tue, 19 Mar 2002 18:24:26 +0000 |
| Subject: | Bug #15976 Updated: socket_get_status(...) returns nothing | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-2897@lists.php.net to get a copy of this message | ||
ID: 15976
Updated by: sean@caedmon.net
Reported By: sean@caedmon.net
Status: Feedback
Bug Type: Sockets related
Operating System: Win32 (2000) AND Linux2.2
PHP Version: 4.1.2
New Comment:
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
Previous Comments:
------------------------------------------------------------------------
[2002-03-18 15:27:28] wez@php.net
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] wez@php.net
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] sean@caedmon.net
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] sean@caedmon.net
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
------------------------------------------------------------------------
[2002-03-12 21:00:39] sean@caedmon.net
It's a non-blocking socket, if that helps
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