#34851 [Opn]: SO_RECVTIMEO sec stands for usec!!!! and usec has no effect!
ID: 34851 Updated by: [EMAIL PROTECTED] Reported By: khayll at motoros dot hu Status: Open Bug Type: Sockets related Operating System: win 2k3 server PHP Version: 4.4.0 New Comment: Winsock implementation does not support all BSD options for setsockopt, SO_RCVTIMEO is within these. Previous Comments: [2005-10-13 18:18:23] khayll at motoros dot hu Please read carefully what I wrote... If I use 0 sec and 500 usec, the script HANGS when there's no response (which means usec has NO EFFECT)! (Sorry I cannot reproduce remote machine not sending a response, but accepting connections) and with a setting of 1 sec 0 usec which is pretty much for a response I get a timeout error. here execute this script and it will show you the script execution time is less than 1 sec at all giving a timeout: ?php echo microtime().br\n; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=1, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); $data = $adu.$pdu; socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); if($result===false) echo socket_strerror(socket_last_error()).br\n; socket_shutdown($socket, 2); socket_close($socket); echo microtime().br\n; ? result: 0.32968200 1129220264 Warning: socket_read() unable to read from socket [0]: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. in c:\data\web\rtu\rtu_web\phpbug.php on line 20 A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 0.89507800 1129220264 [2005-10-13 17:52:57] [EMAIL PROTECTED] Well, that's because USEC are *microseconds*, not milliseconds. Try to use sec=0 usec=500 instead. [2005-10-13 17:52:20] khayll at motoros dot hu sorry I forgot a line from the code: I also decreased the sec param to 1 because for me the remote host is quite fast. ?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=1, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); $data = $adu.$pdu; socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); echo socket_strerror(socket_last_error()); socket_shutdown($socket, 2); socket_close($socket); ? [2005-10-13 17:41:05] khayll at motoros dot hu And if I set sec=0 usec=50 (or 5 for a shorter timeout) it hangs, meaning to me, that usec has no effect. [2005-10-13 17:38:56] khayll at motoros dot hu Actual: Script gives timeout error but it does not wait for 5 seconds for the answer, as set in SO_RCVTIMEO. Expeted: to wait max. 5 second for remote host to answer, but script executes much faster. I tried to increase second to 50 and then it works ok. 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/34851 -- Edit this bug report at http://bugs.php.net/?id=34851edit=1
#34851 [Opn]: SO_RECVTIMEO sec stands for usec!!!! and usec has no effect!
ID: 34851 Updated by: [EMAIL PROTECTED] Reported By: khayll at motoros dot hu Status: Open Bug Type: Sockets related Operating System: win 2k3 server PHP Version: 4.4.0 New Comment: But I cannot reproduce either, here's what I receive (base64), without warnings (on Win2k): PHP-4.3.8: UukXAQMUcmV2LjIuMiAgIgFQMUVSSyA= PHP-5-CVS: /AoXAQMUcmV2LjIuMiAgIgFQMUVSSyA= Previous Comments: [2005-10-14 14:36:03] [EMAIL PROTECTED] Winsock implementation does not support all BSD options for setsockopt, SO_RCVTIMEO is within these. [2005-10-13 18:18:23] khayll at motoros dot hu Please read carefully what I wrote... If I use 0 sec and 500 usec, the script HANGS when there's no response (which means usec has NO EFFECT)! (Sorry I cannot reproduce remote machine not sending a response, but accepting connections) and with a setting of 1 sec 0 usec which is pretty much for a response I get a timeout error. here execute this script and it will show you the script execution time is less than 1 sec at all giving a timeout: ?php echo microtime().br\n; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=1, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); $data = $adu.$pdu; socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); if($result===false) echo socket_strerror(socket_last_error()).br\n; socket_shutdown($socket, 2); socket_close($socket); echo microtime().br\n; ? result: 0.32968200 1129220264 Warning: socket_read() unable to read from socket [0]: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. in c:\data\web\rtu\rtu_web\phpbug.php on line 20 A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 0.89507800 1129220264 [2005-10-13 17:52:57] [EMAIL PROTECTED] Well, that's because USEC are *microseconds*, not milliseconds. Try to use sec=0 usec=500 instead. [2005-10-13 17:52:20] khayll at motoros dot hu sorry I forgot a line from the code: I also decreased the sec param to 1 because for me the remote host is quite fast. ?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=1, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); $data = $adu.$pdu; socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); echo socket_strerror(socket_last_error()); socket_shutdown($socket, 2); socket_close($socket); ? [2005-10-13 17:41:05] khayll at motoros dot hu And if I set sec=0 usec=50 (or 5 for a shorter timeout) it hangs, meaning to me, that usec has no effect. 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/34851 -- Edit this bug report at http://bugs.php.net/?id=34851edit=1
#34851 [Opn]: SO_RECVTIMEO sec stands for usec!!!! and usec has no effect!
ID: 34851 Updated by: [EMAIL PROTECTED] Reported By: khayll at motoros dot hu Status: Open Bug Type: Sockets related Operating System: win 2k3 server PHP Version: 4.4.0 New Comment: Ok, ok, my last comment :) The real problem seems to be that windows expects a DWORD and not a timeval as parameter. Previous Comments: [2005-10-14 15:08:03] [EMAIL PROTECTED] But I cannot reproduce either, here's what I receive (base64), without warnings (on Win2k): PHP-4.3.8: UukXAQMUcmV2LjIuMiAgIgFQMUVSSyA= PHP-5-CVS: /AoXAQMUcmV2LjIuMiAgIgFQMUVSSyA= [2005-10-14 14:36:03] [EMAIL PROTECTED] Winsock implementation does not support all BSD options for setsockopt, SO_RCVTIMEO is within these. [2005-10-13 18:18:23] khayll at motoros dot hu Please read carefully what I wrote... If I use 0 sec and 500 usec, the script HANGS when there's no response (which means usec has NO EFFECT)! (Sorry I cannot reproduce remote machine not sending a response, but accepting connections) and with a setting of 1 sec 0 usec which is pretty much for a response I get a timeout error. here execute this script and it will show you the script execution time is less than 1 sec at all giving a timeout: ?php echo microtime().br\n; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=1, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); $data = $adu.$pdu; socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); if($result===false) echo socket_strerror(socket_last_error()).br\n; socket_shutdown($socket, 2); socket_close($socket); echo microtime().br\n; ? result: 0.32968200 1129220264 Warning: socket_read() unable to read from socket [0]: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. in c:\data\web\rtu\rtu_web\phpbug.php on line 20 A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. 0.89507800 1129220264 [2005-10-13 17:52:57] [EMAIL PROTECTED] Well, that's because USEC are *microseconds*, not milliseconds. Try to use sec=0 usec=500 instead. [2005-10-13 17:52:20] khayll at motoros dot hu sorry I forgot a line from the code: I also decreased the sec param to 1 because for me the remote host is quite fast. ?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=1, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); $data = $adu.$pdu; socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); echo socket_strerror(socket_last_error()); socket_shutdown($socket, 2); socket_close($socket); ? 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/34851 -- Edit this bug report at http://bugs.php.net/?id=34851edit=1
#34851 [Opn]: SO_RECVTIMEO sec stands for usec!!!! and usec has no effect!
ID: 34851 User updated by: khayll at motoros dot hu Reported By: khayll at motoros dot hu Status: Open Bug Type: Sockets related Operating System: win 2k3 server PHP Version: 4.4.0 New Comment: And if I set sec=0 usec=50 (or 5 for a shorter timeout) it hangs, meaning to me, that usec has no effect. Previous Comments: [2005-10-13 17:38:56] khayll at motoros dot hu Actual: Script gives timeout error but it does not wait for 5 seconds for the answer, as set in SO_RCVTIMEO. Expeted: to wait max. 5 second for remote host to answer, but script executes much faster. I tried to increase second to 50 and then it works ok. [2005-10-13 16:16:23] [EMAIL PROTECTED] And actual/expected results please? [2005-10-13 14:36:01] khayll at motoros dot hu ?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=5, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); echo socket_strerror(socket_last_error()); socket_shutdown($socket, 2); socket_close($socket); ? [2005-10-13 12:31:30] [EMAIL PROTECTED] Thank you for this bug report. To properly diagnose the problem, we need a short but complete example script to be able to reproduce this bug ourselves. A proper reproducing script starts with ?php and ends with ?, is max. 10-20 lines long and does not require any external resources such as databases, etc. If possible, make the script source available online and provide an URL to it here. Try to avoid embedding huge scripts into the report. [2005-10-13 11:38:15] khayll at motoros dot hu Description: I tried to set a receive timeout for a socket, but found out that sec is used as usec, and usec is in fact ignored! Reproduce code: --- using a modbus device with address address, sorry i cannot make it available on the net $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=0, usec=500)); socket_connect($socket, address, 502); socket_write($this-socket, $data, strlen($data)); socket_read($this-socket, 512, PHP_BINARY_READ); Expected result: expected to read some data or give a timeout error. Actual result: -- code hangs, so i figured out, that usec has no effect, then i tried 1 sec as timeout, code began to work, but kept reporting timeout, so i figured out if i try a value like 50 as sec it works. Seems like sec is used as usec, and usec has no effect. -- Edit this bug report at http://bugs.php.net/?id=34851edit=1
#34851 [Opn]: SO_RECVTIMEO sec stands for usec!!!! and usec has no effect!
ID: 34851 User updated by: khayll at motoros dot hu Reported By: khayll at motoros dot hu Status: Open Bug Type: Sockets related Operating System: win 2k3 server PHP Version: 4.4.0 New Comment: sorry I forgot a line from the code: I also decreased the sec param to 1 because for me the remote host is quite fast. ?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=1, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); $data = $adu.$pdu; socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); echo socket_strerror(socket_last_error()); socket_shutdown($socket, 2); socket_close($socket); ? Previous Comments: [2005-10-13 17:41:05] khayll at motoros dot hu And if I set sec=0 usec=50 (or 5 for a shorter timeout) it hangs, meaning to me, that usec has no effect. [2005-10-13 17:38:56] khayll at motoros dot hu Actual: Script gives timeout error but it does not wait for 5 seconds for the answer, as set in SO_RCVTIMEO. Expeted: to wait max. 5 second for remote host to answer, but script executes much faster. I tried to increase second to 50 and then it works ok. [2005-10-13 16:16:23] [EMAIL PROTECTED] And actual/expected results please? [2005-10-13 14:36:01] khayll at motoros dot hu ?php $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array(sec=5, usec=0)); socket_connect($socket, 81.182.13.109, 502); $pdu = ; $pdu .= chr(0x03).chr(floor(16000 / 256)).chr(16000 % 256).chr(floor(10 / 256)).chr(10 % 256); $rand = mt_rand(1,65535); //generate random adu id $adu = ; $adu .= chr(floor($rand / 256)).chr($rand % 256).chr(0).chr(0).chr(floor(6 / 256)).chr(6 % 256).chr(1); socket_write($socket, $data, strlen($data)); $result = socket_read($socket, 512, PHP_BINARY_READ); echo socket_strerror(socket_last_error()); socket_shutdown($socket, 2); socket_close($socket); ? [2005-10-13 12:31:30] [EMAIL PROTECTED] Thank you for this bug report. To properly diagnose the problem, we need a short but complete example script to be able to reproduce this bug ourselves. A proper reproducing script starts with ?php and ends with ?, is max. 10-20 lines long and does not require any external resources such as databases, etc. If possible, make the script source available online and provide an URL to it here. Try to avoid embedding huge scripts into the report. 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/34851 -- Edit this bug report at http://bugs.php.net/?id=34851edit=1