Edit report at https://bugs.php.net/bug.php?id=62816&edit=1
ID: 62816 User updated by: xrstf-misc at yahoo dot com Reported by: xrstf-misc at yahoo dot com -Summary: stream_socket_accept does not block +Summary: stream_socket_accept can't block infinitely Status: Open Type: Bug Package: Sockets related Operating System: Linux (ARM) PHP Version: 5.4.5 Block user comment: N Private report: N New Comment: (Changed bug title to better reflect the actual problem.) Previous Comments: ------------------------------------------------------------------------ [2012-08-14 17:10:51] xrstf-misc at yahoo dot com When doing a select() call before accepting, using an infinite timeout works. Seems like select() correctly handles NULL as "no timeout". So I can do (pseudocode): if (1 === select(array($myListeningSocket), null, null, null /* <- timeout */)) { $conn = accept($myListeningSocket); } ------------------------------------------------------------------------ [2012-08-14 14:16:42] xrstf-misc at yahoo dot com Oddly enough, using the "raw" socket functions works as expected. Test code: ---------- $socket = socket_create_listen($port); // instead of stream_socket_server $conn = socket_accept($socket); // instead of stream_socket_accept Maybe there is something wrong with the timeout handling in the stream related functions? ------------------------------------------------------------------------ [2012-08-14 13:25:02] xrstf-misc at yahoo dot com Description: ------------ I'm opening a socket on 0.0.0.0, port 8080 (doesn't matter) and then I'm trying to accept incoming connections. For this, the stream_socket_accept() function should block and wait for connections. This works on Windows and Linux (x86), but on ARM it fails. For some reason, the functions returns immediately, generating a warning: stream_socket_accept(): accept failed: Connection timed out Setting the timeout in my testscript to 0 doesn't change anything. Setting the timeout to a non-infinite one like 10 seconds makes the function block correctly for 10 seconds. The problem occurs in all PHP 5.4 versions. I didn't test 5.3 or earlier. Test script: --------------- <?php $addr = "tcp://0.0.0.0:8080"; $errno = null; $errstr = null; print "\n"; print " > Creating socket @ $addr..."; $socket = stream_socket_server($addr, $errno, $errstr); if ($socket === false) { print " ERROR: $errstr ($errno)\n\n"; exit(2); } print " OK :)\n"; print " > Accepting incoming connections (listening)..."; $conn = stream_socket_accept($socket, -1); print " ERROR: should not have reached this point!\n\n"; exit(1); Expected result: ---------------- The script should stop and wait at the stream_socket_accept() call forever. Actual result: -------------- The function returns false and throws a warning. ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=62816&edit=1