#define DJSTD_BASIC_ENTRY #include "core.c" #include "signal.h" #include "stdlib.h" Server *server = NULL; void handleSigint(int dummy) { if (server) { println(""); println("Closing server socket."); serverClose(server); println("Success."); } signal(SIGINT, SIG_DFL); raise(SIGINT); } int djstd_entry(Arena *arena, StringList args) { signal(SIGINT, &handleSigint); bool isServer = strEql(args.data[0], s("server")); bool isClient = strEql(args.data[0], s("client")); if (!isServer && !isClient || args.length < 2) { println("Usage: [type] [port] ([remote_address])"); println("[type] is either 'server' or 'client'"); println("[remote_address] can be given if a client app, default is loopback"); return 0; } int port = 8080; Int32Result portParsed = parsePositiveInt(args.data[1]); if (portParsed.valid) { port = portParsed.result; } string addr = s("::1"); if (!isServer && args.length > 2) { if (args.data[2].length > 0) { addr = args.data[2]; } } if (isServer) { println("Starting server on port %d", port); Server myserver = serverInit((ServerInitInfo){ .concurrentClients=16, .port=port, .memory=Megabytes(64), }); server = &myserver; serverListen(&myserver); Socket *client = serverAccept(&myserver); forever { string buf = PushStringFill(arena, 256, 0); uint64 bytesRead = socketRead(client, buf.str, buf.length - 1); if (bytesRead > 0) { buf.length = bytesRead; println("Client said: %S", strSplit(arena, s("\n"), buf).data[0]); println("Saying goodbye"); string message = s("Goodbye\n"); socketWrite(client, message.str, message.length); break; } serverClose(&myserver); } socketClose(client); } else { println("Connecting to socket at %S on port %d", addr, port); Socket sock = socketConnect(arena, (SocketConnectInfo){ .address=addr, .port=port }); println("CONNECTED"); string message; uint64 bytesWritten; string buf = PushStringFill(arena, 256, 0); forever { message = s("Howdy partner\n"); print("Saying: %S", message); bytesWritten = socketWrite(&sock, message.str, message.length); socketRead(&sock, buf.str, buf.length); message = strSplit(arena, s("\n"), buf).data[0]; println("Received message: %S", message); if (strEql(message, s("Goodbye"))) { println("Quitting"); break; } } socketClose(&sock); } return 0; }