1+ --TEST--
2+ UDP timeout operations with stream_socket_recvfrom in async context
3+ --FILE--
4+ <?php
5+
6+ use function Async \spawn ;
7+ use function Async \awaitAll ;
8+ use function Async \delay ;
9+
10+ $ output = [];
11+
12+ $ output ['1 ' ] = "Start UDP timeout operations test " ;
13+
14+ $ server_address = null ;
15+
16+ // Server coroutine that tests timeout
17+ $ server = spawn (function () use (&$ server_address , &$ output ) {
18+ $ output ['2 ' ] = "Server: creating UDP socket " ;
19+ $ socket = stream_socket_server ("udp://127.0.0.1:0 " , $ errno , $ errstr , STREAM_SERVER_BIND );
20+ if (!$ socket ) {
21+ $ output ['2a ' ] = "Server: failed to create socket: $ errstr " ;
22+ return ;
23+ }
24+
25+ $ address = stream_socket_get_name ($ socket , false );
26+ $ server_address = "udp:// $ address " ;
27+ $ output ['3 ' ] = "Server: listening on $ server_address " ;
28+
29+ // Set timeout to 2 seconds
30+ stream_set_timeout ($ socket , 2 , 0 );
31+ $ output ['4 ' ] = "Server: set timeout to 2 seconds " ;
32+
33+ // Try to receive data (should timeout)
34+ $ output ['5 ' ] = "Server: waiting for UDP data (should timeout) " ;
35+ $ start_time = microtime (true );
36+ $ data = stream_socket_recvfrom ($ socket , 1024 , 0 , $ peer );
37+ $ end_time = microtime (true );
38+
39+ $ meta = stream_get_meta_data ($ socket );
40+ $ elapsed = round ($ end_time - $ start_time , 1 );
41+
42+ if ($ meta ['timed_out ' ]) {
43+ $ output ['6 ' ] = "Server: operation timed out after $ elapsed seconds " ;
44+ } else {
45+ $ output ['6 ' ] = "Server: received data (unexpected): ' $ data' " ;
46+ }
47+
48+ fclose ($ socket );
49+ return $ server_address ;
50+ });
51+
52+ awaitAll ([$ server ]);
53+ $ output ['z ' ] = "End UDP timeout operations test " ;
54+
55+ // Sort output by keys to ensure deterministic test results
56+ ksort ($ output );
57+
58+ // Output sorted results
59+ foreach ($ output as $ line ) {
60+ echo $ line . "\n" ;
61+ }
62+
63+ ?>
64+ --EXPECTF--
65+ Warning: stream_socket_recvfrom(): Socket operation timed out after 2.000000 seconds in %s on line %d
66+ Start UDP timeout operations test
67+ Server: creating UDP socket
68+ Server: listening on udp://127.0.0.1:%d
69+ Server: set timeout to 2 seconds
70+ Server: waiting for UDP data (should timeout)
71+ Server: operation timed out after %s seconds
72+ End UDP timeout operations test
0 commit comments