#45514 [Opn->Fbk]: socket_select + timeout returns immediately on non-blocking connect
ID: 45514
Updated by: jani@php.net
Reported By: rbarnes at aethon dot com
-Status: Open
+Status: Feedback
Bug Type: Sockets related
Operating System: Ubuntu 7.10 / Linux 2.6.22-14
PHP Version: 5.2.6
New Comment:
Well, in one other report about basically same issue the comments were
along the lines of "ext/sockets" being "deprecated" and the stream_*
stuff being the suggested way to get working solution. Don't hold your
breath waiting for anything getting fixed in ext/sockets, there's no
maintainer for that.
Previous Comments:
------------------------------------------------------------------------
[2008-07-15 15:20:43] rbarnes at aethon dot com
Thanks for the tip, but the point of the bug report is that
socket_select doesn't work properly. The fact that I could
theoretically rewrite all of the networking code in my API to use the
stream_* functions doesn't change the fact that socket_select is broken.
I also already know of other ways to implement non-blocking connect
with the socket_* functions, but as I said that also doesn't change the
fact that this juk is bugging me. Yalla, fix it or mark the Berkley
Sockets API deprecated ;-)
------------------------------------------------------------------------
[2008-07-15 13:06:10] jani@php.net
Try using stream_select() and the other stream_* functions instead:
http://www.php.net/manual/en/ref.stream.php
------------------------------------------------------------------------
[2008-07-14 21:58:01] rbarnes at aethon dot com
Description:
------------
I'm trying to implement a non-blocking connect similar to the one in
Steven's "Unix Network Programming" on pg 450.
I create the socket, set it to non-blocking and call connect which of
course returns immediately with a SOCKET_EINPROGRESS error ( as expected
).
Then I call socket_select with a timeout greater than 0 and
socket_select returns immediately, even though the socket's state is
still SOCKET_EINPROGRESS.
errno 115: Operation now in progress
Reproduce code:
---------------
function ConnectSocket($remote, $port) {
$sock = NULL;
if (!($sock = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP)))
return NULL;
socket_set_nonblock($sock);
if (!@socket_connect($sock, $remote, $port+0)) {
if (socket_select($rin = array($sock), $win = $rin, $ein =
NULL, 30.0) < 1) return NULL;
if (socket_recv($sock, $buf, 0, 0) === false) {
print socket_strerror(socket_last_error()) . "\n";
return NULL;
}
}
socket_set_block($sock);
return $sock;
}
ConnectSocket('206.190.60.37', 80);
Expected result:
----------------
socket_select should block until either the connection completes or the
timeout is exceeded.
Actual result:
--------------
socket_select returns immediately.
SOCKET_EINPROGRESS
Operation now in progress
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=45514&edit=1
Thread (6 messages)