1 module echo_server; 2 3 import std.stdio; 4 import std.socket; 5 import std.conv; 6 import std.string; 7 import std.algorithm; 8 import std.conv; 9 import std.format; 10 import std.range; 11 12 import core.thread; 13 14 import photon; 15 16 // telnet localhost 1337 17 void server_worker(Socket client) { 18 ubyte[1024] buffer; 19 scope(exit) { 20 client.shutdown(SocketShutdown.BOTH); 21 client.close(); 22 } 23 logf("Started server_worker, client = %s", client); 24 for(;;) { 25 ptrdiff_t received = client.receive(buffer); 26 if (received < 0) { 27 perror("Error while reading from client"); 28 return; 29 } 30 else if (received == 0) { //socket is closed (eof) 31 return; 32 } 33 else { 34 logf("Server_worker received:\n<%s>", cast(char[])buffer[0.. received]); 35 parser.execute(buffer[0..received]); 36 } 37 ptrdiff_t sent; 38 do { 39 ptrdiff_t ret = client.send(buf[sent .. received]); 40 if (ret < 0) { 41 perror("Error while writing to client"); 42 return; 43 } 44 sent += received; 45 } while(sent < received); 46 } while(keepAlive); 47 } 48 49 void server() { 50 Socket server = new TcpSocket(); 51 server.setOption(SocketOptionLevel.SOCKET, SocketOption.REUSEADDR, true); 52 server.bind(new InternetAddress("localhost", 1337)); 53 server.listen(1000); 54 55 logf("Started server"); 56 void processClient(Socket client) { 57 go(() => server_worker(client)); 58 } 59 while(true) { 60 logf("Waiting for server.accept()"); 61 Socket client = server.accept(); 62 logf("New client accepted %s", client); 63 processClient(client); 64 } 65 } 66 67 void main() { 68 startloop(); 69 spawn(() => server()); 70 runFibers(); 71 }