|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-10-13 11:38 UTC] 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 500000 as sec it works. Seems like sec is used as usec, and usec has no effect.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Wed Oct 29 09:00:01 2025 UTC |
<?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); ?>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); ?>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