#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=2, .port=port, .memory=Megabytes(64), }); server = &myserver; serverListen(&myserver); Socket *client1 = serverAccept(&myserver); Socket *client2 = serverAccept(&myserver); Forever { string message = s("Hello. You are client 1.\n"); socketWrite(client1, message.str, message.length); message = s("Hello. You are client 2.\n"); socketWrite(client2, message.str, message.length); string buf = PushStringFill(arena, 256, 0); uint64 bytesRead = socketRead(client1, buf.str, buf.length - 1); if (bytesRead > 0) { buf.length = bytesRead; string message = strSplit(arena, s("\n"), buf).data[0]; message = strPrintf(arena, "Client 1 said: %S\n", message); println("%S", message); socketWrite(client2, message.str, message.length); println("Saying goodbye to everyone"); message = s("Goodbye\n"); socketWrite(client1, message.str, message.length); socketWrite(client2, message.str, message.length); break; } } socketClose(client1); socketClose(client2); serverClose(&myserver); } else { println("Connecting to socket at %S on port %d", addr, port); Socket sock = socketConnect(arena, (SocketConnectInfo){ .address=addr, .port=port }); if (sock.closed) { println("Connection error. Closing."); } else { string message; uint64 bytesWritten; string buf = PushStringFill(arena, 256, 0); socketRead(&sock, buf.str, buf.length); string messageReceived = strSplit(arena, s("\n"), buf).data[0]; println("%S", strPrintf(arena, "Server said: %S", messageReceived)); if (strEql(messageReceived, s("Hello. You are client 1."))) { string broadcast = s("HELLO WORLD!!!!\n"); socketWrite(&sock, broadcast.str, broadcast.length); } Forever { socketRead(&sock, buf.str, buf.length); messageReceived = strSplit(arena, s("\n"), buf).data[0]; println("Server said: %S", messageReceived); if (strEql(messageReceived, s("Goodbye"))) { println("Quitting"); break; } } } socketClose(&sock); } return 0; }