#include #include #include #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("[Host] 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("[Host] 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); char *argv[] = {"./worker", portStr, NULL}; extern char **environ; pid_t pid; posix_spawn(&pid, "./worker", NULL, NULL, argv, environ); } 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); 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("[Host] 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("[Host] Unassigning port %i\n", port); ports[abs(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; }