diff --git a/main.c b/main.c index 3bd07b3..206f33c 100644 --- a/main.c +++ b/main.c @@ -3,12 +3,30 @@ #include #include #include +#include #include #include #include bool ports[999]; +int start_server(int* socket_fd) { + struct sockaddr_in server_addr; + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(1337); + server_addr.sin_addr.s_addr = INADDR_ANY; + + printf("Starting Server\n"); + *socket_fd = socket(AF_INET, SOCK_STREAM, 0); + int bound = bind(*socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); + if(bound < 0) { + printf("Bind Error: %s (%d)\n", strerror(errno), errno); + return 1; + } + listen(*socket_fd, 5); + return 0; +} + void start_worker(int port) { char portStr[6]; sprintf(portStr, "%d", port); @@ -19,41 +37,50 @@ void start_worker(int port) { posix_spawn(&pid, "./worker", NULL, NULL, argv, environ); } -int main() { - struct sockaddr_in server_addr; - server_addr.sin_family = AF_INET; - server_addr.sin_port = htons(1337); - server_addr.sin_addr.s_addr = INADDR_ANY; - - printf("Starting Server\n"); - int socket_fd; - socket_fd = socket(AF_INET, SOCK_STREAM, 0); - int bound = bind(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); - if(bound < 0) { - printf("Bind Error: %s (%d)\n", strerror(errno), errno); - return 1; - } - listen(socket_fd, 5); - +int assign_workers(int* socket_fd) { while(true) { struct sockaddr_in client_addr; int client_size = sizeof(client_addr); - int client_sock = accept(socket_fd, (struct sockaddr*)&client_addr, &client_size); - - for(int i = 0; i < sizeof(ports); i++) { - if(!ports[i]) { - int port = 11000+i; - printf("Assigning port %i to worker\n", port); - char buff[4]; - memcpy(buff, &port, sizeof(int)); - write(client_sock, buff, sizeof(buff)); - start_worker(port); - ports[i] = true; - shutdown(client_sock, SHUT_RDWR); - close(client_sock); - break; + int client_sock = accept(*socket_fd, (struct sockaddr*)&client_addr, &client_size); + + char buffer[5]; + int bytes_received; + bytes_received = recv(client_sock, buffer, sizeof(buffer), 0); + if(bytes_received < 0 || bytes_received == 0) { + continue; + } + + if(buffer[0] == 0x0) { // Get Port + for(int i = 0; i < sizeof(ports); i++) { + if(!ports[i]) { + int port = 11000+i; + printf("Assigning port %i to worker\n", port); + char buff[sizeof(int)]; + memcpy(buff, &port, sizeof(int)); + write(client_sock, buff, sizeof(buff)); + start_worker(port); + ports[i] = true; + shutdown(client_sock, SHUT_RDWR); + close(client_sock); + break; + } } + } else if(buffer[0] == 0x1) { // Remove Worker + u_int32_t port; + memcpy(&port, buffer+1, sizeof(u_int32_t)); + port = ntohl(port); + printf("Unassigning port %i\n", port); + ports[11000-port] = false; + shutdown(client_sock, SHUT_RDWR); + close(client_sock); } } return 0; } + +int main() { + int* socket_fd; + start_server(socket_fd); + assign_workers(socket_fd); + return 0; +}