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 }