1--TEST-- 2swoole_socket_coro: complete test server&&client&&timeout(millisecond) 3--SKIPIF-- 4<?php require __DIR__ . '/../include/skipif.inc'; ?> 5--FILE-- 6<?php 7require __DIR__ . '/../include/bootstrap.php'; 8$pm = new ProcessManager; 9$port = get_one_free_port(); 10$pm->parentFunc = function ($pid) use ($pm, $port) { 11 $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, 0); 12 Assert::isInstanceOf($socket, Swoole\Coroutine\Socket::class); 13 Assert::same($socket->errCode, 0); 14 go(function () use ($socket, $port) { 15 Assert::assert($socket->connect('localhost', $port)); 16 $i = 0.000; 17 while (true) { 18 $socket->send("hello"); 19 $server_reply = $socket->recv(1024, 0.1); 20 Assert::same($server_reply, 'swoole'); 21 co::sleep($i += .001); // after 10 times we sleep 0.01s to trigger server timeout 22 if ($i > .01) { 23 break; 24 } 25 } 26 co::sleep(0.5); 27 echo("client exit\n"); 28 $socket->close(); 29 }); 30 swoole_event_wait(); 31}; 32 33$pm->childFunc = function () use ($pm, $port) { 34 $socket = new Swoole\Coroutine\Socket(AF_INET, SOCK_STREAM, 0); 35 Assert::assert($socket->bind('127.0.0.1', $port)); 36 Assert::assert($socket->listen(128)); 37 go(function () use ($socket, $pm) { 38 $client = $socket->accept(); 39 Assert::isInstanceOf($client, Swoole\Coroutine\Socket::class); 40 $i = 0; 41 while (true) { 42 $client_data = $client->recv(1024, 0.1); 43 if ($client->errCode > 0) { 44 Assert::same($client->errCode, SOCKET_ETIMEDOUT); 45 break; 46 } else { 47 $i++; 48 Assert::same($client_data, 'hello'); 49 $client->send('swoole'); 50 } 51 } 52 echo "$i\n"; 53 echo("sever exit\n"); 54 usleep(1); 55 $client->close(); 56 $socket->close(); 57 }); 58}; 59 60$pm->childFirst(); 61$pm->run(); 62?> 63--EXPECT-- 6410 65sever exit 66client exit 67