|
| 1 | +--TEST-- |
| 2 | +feof() returns false on a live connected socket |
| 3 | +--FILE-- |
| 4 | +<?php |
| 5 | + |
| 6 | +use Async\Channel; |
| 7 | +use function Async\spawn; |
| 8 | +use function Async\await_all; |
| 9 | + |
| 10 | +echo "Start\n"; |
| 11 | + |
| 12 | +$s2c = new Channel(1); // server -> client |
| 13 | +$c2s = new Channel(1); // client -> server |
| 14 | + |
| 15 | +$server = spawn(function() use ($s2c, $c2s) { |
| 16 | + $socket = stream_socket_server("tcp://127.0.0.1:0", $errno, $errstr); |
| 17 | + if (!$socket) { |
| 18 | + echo "Server: failed - $errstr\n"; |
| 19 | + return; |
| 20 | + } |
| 21 | + |
| 22 | + // Signal the address to the client |
| 23 | + $s2c->send(stream_socket_get_name($socket, false)); |
| 24 | + |
| 25 | + $client = stream_socket_accept($socket, 5); |
| 26 | + echo "Server: accepted\n"; |
| 27 | + |
| 28 | + // Signal that connection is established |
| 29 | + $s2c->send("connected"); |
| 30 | + |
| 31 | + // Wait for client to finish feof check |
| 32 | + $c2s->recv(); |
| 33 | + |
| 34 | + // Close client connection |
| 35 | + fclose($client); |
| 36 | + echo "Server: closed client\n"; |
| 37 | + |
| 38 | + // Signal that server closed the connection |
| 39 | + $s2c->send("closed"); |
| 40 | + |
| 41 | + fclose($socket); |
| 42 | +}); |
| 43 | + |
| 44 | +$client = spawn(function() use ($s2c, $c2s) { |
| 45 | + $address = $s2c->recv(); |
| 46 | + |
| 47 | + $sock = stream_socket_client("tcp://$address", $errno, $errstr, 5); |
| 48 | + if (!$sock) { |
| 49 | + echo "Client: failed - $errstr\n"; |
| 50 | + return; |
| 51 | + } |
| 52 | + echo "Client: connected\n"; |
| 53 | + |
| 54 | + // Wait for server to confirm accept |
| 55 | + $s2c->recv(); |
| 56 | + |
| 57 | + // Socket is alive — feof() MUST return false |
| 58 | + $eof = feof($sock); |
| 59 | + echo "feof on live socket: " . ($eof ? "true (BUG!)" : "false") . "\n"; |
| 60 | + |
| 61 | + // Tell server it can close now |
| 62 | + $c2s->send("done"); |
| 63 | + |
| 64 | + // Wait for server to confirm close |
| 65 | + $s2c->recv(); |
| 66 | + |
| 67 | + // Give TCP stack time to deliver FIN |
| 68 | + \Async\delay(1); |
| 69 | + |
| 70 | + // Server closed — feof() should return true |
| 71 | + $eof = feof($sock); |
| 72 | + echo "feof after remote close: " . ($eof ? "true" : "false (BUG!)") . "\n"; |
| 73 | + |
| 74 | + fclose($sock); |
| 75 | +}); |
| 76 | + |
| 77 | +await_all([$server, $client]); |
| 78 | + |
| 79 | +echo "End\n"; |
| 80 | + |
| 81 | +?> |
| 82 | +--EXPECTF-- |
| 83 | +Start |
| 84 | +%AServer: accepted |
| 85 | +%AClient: connected |
| 86 | +%Afeof on live socket: false |
| 87 | +Server: closed client |
| 88 | +feof after remote close: true |
| 89 | +End |
0 commit comments