1 /+ dub.sdl: 2 name "t4" 3 dflags "-I../source" 4 #dflags "-fsanitize=address" 5 #dflags "-debug" 6 dmdflags "-check=assert=off" 7 dmdflags "-check=in=off" 8 dmdflags "-check=out=off" 9 dmdflags "-check=invariant=off" 10 dmdflags "-check=bounds=off" 11 // dflags "-profile=gc" 12 // #debugVersions "nbuff" 13 #debugVersions "timingwheels" 14 #debugVersions "cachetools" 15 lflags "-lcares" 16 buildRequirements "allowWarnings" 17 dependency "hio" version="*" 18 dependency "nbuff" version="*" 19 +/ 20 21 module tests.t4; 22 import std.experimental.logger; 23 import std.datetime; 24 import std.string; 25 import std.algorithm; 26 import std.range; 27 28 import core.atomic; 29 30 import hio.socket; 31 import hio.scheduler; 32 import hio.loop; 33 34 import nbuff: Nbuff, NbuffChunk; 35 36 37 void server(int so) 38 { 39 auto loop = getDefaultLoop(); 40 auto server_socket = new hlSocket(so); 41 42 void acceptFunction(AsyncSocketLike s) @safe 43 { 44 if ( s is null ) 45 { 46 // timeout 47 server_socket.accept(loop, 5.seconds, &acceptFunction); 48 return; 49 } 50 int requests; 51 IORequest iorq; 52 void delegate(ref IOResult) @safe ioWriteCompleted; 53 void delegate(ref IOResult) @safe ioReadCompleted; 54 55 auto client_socket = cast(hlSocket)s; 56 ioWriteCompleted = delegate void(scope ref IOResult iores) @safe 57 { 58 if (iores.error) 59 { 60 //throw new Exception("err"); 61 client_socket.close(); 62 return; 63 } 64 if (requests < 1000) 65 { 66 requests++; 67 iorq.to_read = 1024; 68 iorq.callback = ioReadCompleted; 69 client_socket.io(loop, iorq, 10.seconds); 70 } 71 else 72 { 73 client_socket.close(); 74 } 75 }; 76 77 ioReadCompleted = delegate void(scope ref IOResult iores) @safe 78 { 79 if ( !iores.timedout && !iores.error ) 80 { 81 IORequest iorq; 82 iorq.output = Nbuff("HTTP/1.0 200 OK\nContent-Type: text/plain\nContent-Length: 10\n\n0123456789"); 83 iorq.callback = ioWriteCompleted; 84 client_socket.io(loop, iorq, 10.seconds); 85 } 86 else 87 { 88 client_socket.close(); 89 } 90 }; 91 92 iorq.to_read = 1024; 93 iorq.callback = ioReadCompleted; 94 client_socket.io(loop, iorq, 10.seconds); 95 } 96 server_socket.accept(loop, 5.seconds, &acceptFunction); 97 hlSleep(60.seconds); 98 } 99 100 immutable servers = 4; 101 102 void main() 103 { 104 globalLogLevel = LogLevel.info; 105 auto server_socket = new HioSocket(); 106 server_socket.bind("0.0.0.0:12345"); 107 server_socket.listen(1024); 108 auto server_threads = iota(servers).map!(i => threaded(&server, server_socket.fileno).start).array; 109 }