#include "SS13ArcadeEnv.h" #include #include #include #include #include #include #include #include #include #include #include int SetupServer(int* socket_fd, int port) { printf("[Client] Starting Server\n"); *socket_fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = INADDR_ANY; int bound = bind(*socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(bound < 0) { printf("[Client] Bind error: %s (%i)\n", strerror(errno), errno); return -1; } listen(*socket_fd, 5); return 0; } int RemoveServer(int port) { int socket_fd = socket(AF_INET, SOCK_STREAM, 0); struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_port = htons(1337); server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); int connected = connect(socket_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)); if(connected < 0) { printf("[Client] Connect error: %s (%i)\n", strerror(errno), errno); return -1; } printf("[Client] Removing Server\n"); char data[5]; char flag = 0x1; u_int32_t nport = htonl(port); memcpy(data, &flag, sizeof(char)); memcpy(data+1, &nport, sizeof(u_int32_t)); int bytes_sent = send(socket_fd, data, sizeof(data), 0); if(bytes_sent == -1) { printf("[Client] Send error: %s (%i)\n", strerror(errno), errno); return -1; } return 0; } int StartEnv(int port) { int socket_fd; int setup = SetupServer(&socket_fd, port); if(setup < 0) { printf("[Client] Error setting up server\n"); return -1; } struct sockaddr_in client_addr; int client_size = sizeof(client_addr); int client_sock = accept(socket_fd, (struct sockaddr*)&client_addr, &client_size); srand(time(NULL)); int obs_size = sizeof(struct Observation); struct SS13ArcadeEnv env; CreateEnvironment(&env); while(true) { char buffer[5]; int bytes_received; bytes_received = recv(client_sock, buffer, sizeof(buffer), 0); if(bytes_received < 0) { printf("[Client] Receive Error: %s (%d)\n", strerror(errno), errno); } else if(bytes_received == 0) { break; } if(buffer[0] == 0x0) { // Step uint32_t action; memcpy(&action, buffer+1, sizeof(uint32_t)); action = ntohl(action); struct Observation obs; Step(&env, action, &obs); char data[obs_size]; memcpy(&data, &obs, obs_size); send(client_sock, data, obs_size, 0); } else if(buffer[0] == 0x1) { // Reset struct State state; Reset(&env, &state); char data[sizeof(state)]; memcpy(&data, &state, sizeof(state)); send(client_sock, data, sizeof(state), 0); } } RemoveServer(port); shutdown(client_sock, SHUT_RDWR); close(client_sock); return 0; } int main(int argc, char* argv[]) { int env = StartEnv(atoi(argv[1])); if(env < 0) { printf("[Client] Error starting environment"); return 1; } return 0; }