import std.conv, std.stdio, std.boxer, std.string, std.thread, std.socket, std.c.time, std.socketstream; import data_struct, memstream; // runs on 127.0.0.1 if there's no Internet static final bool INTERNET = false; static int ID = 0; synchronized static ClientThread[int] clients; int main(char[][] args) { if(args.length < 2) { writefln("Usage: %s port", args[0]); return 1; } int port; try { port = toInt(args[1]); } catch { writefln("You have to input a valid port!"); return 1; } if(port < 0 || port > 65536) { writefln("The port neds to be >= 0 and <= 65536!"); return 1; } auto serv = new ServerThread(port); serv.start(); while(1) sleep(10); return 0; } char[] getExternalIP() { char[] ip = "127.0.0.1"; if(!INTERNET) return ip; auto sock = new TcpSocket(new InternetAddress("myip.dk", 80)); auto ss = new SocketStream(sock); ss.writeString("GET / HTTP/1.1\r\nHost: myip.dk\r\n\r\n"); // skip the header junk.. char[] line; for(;;) { line = ss.readLine(); if(!line.length) break; } while(!ss.eof()) { line = ss.readLine(); int pos = find(line, "face=\"Verdana\">"); if(pos != -1) { int pos2 = find(line, ""); if(pos2 != -1) { ip = line[(pos+18)..pos2]; break; } } } return ip; } class ServerThread : Thread { private { ushort port; Socket socket; } this(ushort port) { this.port = port; socket = new TcpSocket(AddressFamily.INET); } int run() { try { char[] ip = getExternalIP(); writef("Opening socket on %s:%d..", ip, port); socket.bind(new InternetAddress(ip, port)); writefln(" Done!"); socket.listen(1); while(socket.isAlive()) { Socket s = socket.accept(); writefln("Incoming connection from %s", s.remoteAddress); auto c = new ClientThread(s, ID++); c.start(); clients[ID] = c; } } catch(SocketAcceptException e) { writefln("%s", e); } return 0; } } class ClientThread : Thread { private { int id; Socket socket; SocketStream ss; } this(Socket socket, int id) { this.socket = socket; ss = new SocketStream(this.socket); this.id = id; } int run() { try { data d; d.id = 100; d.content ~= "test of this struct"; writefln("d.sizeof = %d, d.id.sizeof = %d, d.content.sizeof = %d", d.sizeof, d.id.sizeof, d.content.sizeof); auto mem = new mem_stream(); mem.write(d); data d_ = mem.read!(data); writefln("[id:%d] len=%d, dat=%s", d_.id, mem.getBuffer().length, d_.content); ss.write(mem.getBuffer()); while(socket.isAlive()) { char[] line = ss.readLine(); if(line.length == 0) { writefln("Client closed: %s", socket.remoteAddress); socket.shutdown(SocketShutdown.BOTH); socket.close(); clients.remove(id); } else writefln(">>> %s", line); } } catch(Exception e) { writefln("%s", e); } return 0; } }