#include #include #include #include #include #include #include #include #include #include typedef struct { int socket; struct sockaddr_in address; } TData; typedef struct { float x; float y; float z; } TPosition; typedef struct { float x; float y; float z; float w; } TRotation; typedef struct { TPosition position; TRotation rotation; char shoot; char hit; } TFloat; void Error(int err); void *dataProcessHandler(void *data); int main(void) { int e = 0; int i = 0; struct sockaddr_in myAddr; int sockMain; int port = 8080; socklen_t addrLen; int sock[2]; struct sockaddr_in myAddrForClients[2]; struct sockaddr_in clients[2]; struct sockaddr_in tmp; myAddr.sin_family = AF_INET; myAddr.sin_port = htons(port); myAddr.sin_addr.s_addr = INADDR_ANY; myAddrForClients[0].sin_family = AF_INET; myAddrForClients[1].sin_family = AF_INET; myAddrForClients[0].sin_port = htons(60000); myAddrForClients[1].sin_port = htons(60000); myAddrForClients[0].sin_addr.s_addr = INADDR_ANY; myAddrForClients[1].sin_addr.s_addr = INADDR_ANY; pthread_t video_thread; if (pthread_create(&video_thread, NULL, videoHandler, NULL) < 0) { printf("Error"); perror('video_thread'); return -1; }; for (i = 0; i < 2; i++) { if ((sock[i] = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { Error(e++); return -1; } while (bind(sock[i], (struct sockaddr *)&myAddrForClients[i], sizeof(struct sockaddr_in)) < 0) { myAddrForClients[i].sin_port = htons(ntohs(myAddrForClients[i].sin_port) + 1); } } if ((sockMain = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { Error(e++); return -1; } if (bind(sockMain, (struct sockaddr *)&myAddr, sizeof(struct sockaddr_in)) < 0) { Error(e++); return -1; } addrLen = sizeof(struct sockaddr_in); int flag = 2; int recvLen, sendLen; char buf[5]; memset(buf, 0, sizeof(buf)); while (flag) { recvLen = recvfrom(sockMain, buf, 5, 0, (struct sockaddr *)&tmp, &addrLen); if (buf[0] != 'U' || buf[1] != 'N' || buf[2] != 'I' || buf[3] != 'T' || buf[4] != 'Y') { Error(e++); return -1; } clients[2 - flag--] = tmp; } for (i = 0; i < (sizeof(myAddrForClients) / sizeof(myAddrForClients[0])); i++) { char port2char[8]; sprintf(port2char, "%d\r\n", ntohs(myAddrForClients[i].sin_port)); sendLen = sendto(sockMain, port2char, sizeof(port2char), 0, (struct sockaddr *)&clients[i], sizeof(clients[i])); } //Unity's got port number to connect //myAddrForClients[x] holds server addresses for each Unity player //clients[x] holds Unity's addresses pthread_t handlers[2]; TData data[2]; int size = (sizeof(handlers) / sizeof(handlers[0])); for (i = 0; i < size; i++) { data[i].socket = sock[i]; data[i].address = clients[size - 1 - i]; } for (i = 0; i < size; i++) { if (pthread_create(&handlers[i], NULL, dataProcessHandler, &data[i])) { Error(e++); return -1; } } for (i = 0; i < size; i++) { if (pthread_join(handlers[i], NULL)) { Error(e++); return -1; } } close(sockMain); close(sock[0]); close(sock[1]); return 0; } void *dataProcessHandler(void *data) { TData *info = (TData *)data; TFloat floats; memset(&floats, 0, sizeof(floats)); struct sockaddr_in tmp; socklen_t addrLen; printf("HANDLER STARTED..\n"); printf("LOOKING AT SOCKET: %d, ON PORT: %d\n", info->socket, ntohs(info->address.sin_port)); while (1) { if (recvfrom(info->socket, &floats, 30, 0, (struct sockaddr *)&tmp, &addrLen) != 30) continue; sendto(info->socket, &floats, 30, 0, (struct sockaddr *)&info->address, sizeof(info->address)); } return NULL; } void Error(int err) { printf("Error! Code: %d\n", err); } void *videoHandler() { printf("video_handler\n"); char video_buffer[1024]; struct stat *movieInfo; int counter = 0; //Counts users that request video data int VideoSocketTCP; int new_socket; int read_movie; struct sockaddr_in video_address_tcp; int addrlen = sizeof(video_address_tcp); if ((VideoSocketTCP = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("tcp video socket"); exit(1); } video_address_tcp.sin_family = AF_INET; video_address_tcp.sin_addr.s_addr = INADDR_ANY; video_address_tcp.sin_port = htons(8989); if (bind(VideoSocketTCP, (struct sockaddr *)&video_address_tcp, sizeof(video_address_tcp)) < 0) { perror("bind failed"); return -1; } if (listen(VideoSocketTCP, 3) < 0) { perror("listen"); return -1; } while (counter < 2) { if ((new_socket = accept(VideoSocketTCP, (struct sockaddr *)&video_address_tcp, (socklen_t)&addrlen) < 0)) { perror("accept"); return -1; } int movie_open = open("assets/test3.mp4", O_RDONLY); int movie_file_stat = fstat(movie_open, movieInfo); send(new_socket, &movieInfo->st_size, sizeof(movieInfo->st_size), 0); while ((read_movie = read(movie_open, video_buffer, sizeof(video_buffer))) > 0) { send(new_socket, video_buffer, sizeof(video_buffer), 0); } counter++; } close(VideoSocketTCP); close(new_socket); return 0; }