Bug #75283 [Fbk->NoF]: Disconnection not detected by socket_read()

From: Date: Sun, 13 Jun 2021 04:22:13 +0000
Subject: Bug #75283 [Fbk->NoF]: Disconnection not detected by socket_read()
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-234388@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=75283&edit=1 ID: 75283 Updated by: php-bugs@lists.php.net Reported by: privacy dot and dot spam dot protection at gmx dot fr Summary: Disconnection not detected by socket_read() -Status: Feedback +Status: No Feedback Type: Bug Package: Sockets related Operating System: Debian PHP Version: 7.0.24 Assigned To: cmb Private report: N New Comment: No feedback was provided. The bug is being suspended because we assume that you are no longer experiencing the problem. If this is not the case and you are able to provide the information that was requested earlier, please do so and change the status of the bug back to "Re-Opened". Thank you. Previous Comments: ------------------------------------------------------------------------ [2021-06-02 11:00:08] cmb@php.net Is this still an issue with any of the actively supported PHP versions[1]? [1] <https://www.php.net/supported-versions.php> ------------------------------------------------------------------------ [2017-09-29 13:18:09] privacy dot and dot spam dot protection at gmx dot fr I haven't got server code because I use an RS232 TCP/IP converter's box. Problem happens when there's an ellectric shutdown, PHP socket_read function doesn't detect disconnection ------------------------------------------------------------------------ [2017-09-29 11:13:27] requinix@php.net Looks like the socket is still open, not reset. I haven't been able to reproduce your output in a way where the socket is reset/closed. What's the server code? What's the actual client code that sends data to the server in order to trigger the RST? ------------------------------------------------------------------------ [2017-09-29 09:54:56] privacy dot and dot spam dot protection at gmx dot fr Description: ------------ According to documentation, an empty string ("") is returned by socket_read() when there's no more data to read and false value on error (including if the remote host has closed the connection). However when socket_read has no data to read false is still returned. So it's impossible to detect if connection has been reseted by pear. Test script: --------------- $co = false; while (!$co) { $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if ($socket !== false) echo "OK 1.\n"; $result = socket_connect($socket, $address, $service_port); if ($socket !== false) { socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 1)); echo "OK 2.\n"; $co = true; } } while (true) { socket_clear_error($socket); $out = socket_read($socket, 2048); $socket_last_error = socket_last_error($socket); $strErr = socket_strerror($socket_last_error) . ' ' . $socket_last_error; echo date('Ymd H:i:s') . " : $strErr ($socket_last_error) => " . var_export($out, true) . PHP_EOL; } Expected result: ---------------- OK 1. Try connection '9.3.0.23' on port '30001'... OK 2. // client's connected on server // no data have been sent by server 20170929 11:09:17 : Success 0 (0) => '' 20170929 11:09:18 : Success 0 (0) => '' 20170929 11:09:19 : Success 0 (0) => '' //server send data 20170929 11:09:19 : Success 0 (0) => 'a' 20170929 11:09:19 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' // no data have been sent by server 20170929 11:09:21 : Success 0 (0) => '' 20170929 11:09:22 : Success 0 (0) => '' 20170929 11:09:23 : Success 0 (0) => '' // connection is reset by server 20170929 11:09:24 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:25 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:26 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:27 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:28 : Resource temporarily unavailable 11 (11) => false Actual result: -------------- OK 1. Try connection '9.3.0.23' on port '30001'... OK 2. // client's connected on server // no data have been sent by server 20170929 11:09:17 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:18 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:19 : Resource temporarily unavailable 11 (11) => false //server send data 20170929 11:09:19 : Success 0 (0) => 'a' 20170929 11:09:19 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' 20170929 11:09:20 : Success 0 (0) => 'a' // no data have been sent by server 20170929 11:09:21 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:22 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:23 : Resource temporarily unavailable 11 (11) => false // connection is reset by server 20170929 11:09:24 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:25 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:26 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:27 : Resource temporarily unavailable 11 (11) => false 20170929 11:09:28 : Resource temporarily unavailable 11 (11) => false ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=75283&edit=1

« previous php.bugs (#234388) next »