123 lines
3.8 KiB
C
123 lines
3.8 KiB
C
#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;
|
|
}
|