X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=jam.c;h=e772fd9d9d4217725c5db903de8b505f80bab9ab;hb=e56014729532a37e05a977b85c9e3bbd3884cc75;hp=a25f80c06c9cd589e1b7e602a5756a4242dec93b;hpb=c01f4b6195c4562e346896de800f932309abf2ab;p=jam diff --git a/jam.c b/jam.c index a25f80c..e772fd9 100644 --- a/jam.c +++ b/jam.c @@ -1,16 +1,96 @@ #include #include +#include #include #include #include -int main() +void *receiver_worker(void *arg) { - int server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + int sock = (int)arg; + char buf[65536]; + + printf("Received worker for socket %u\n", sock); + + for ( ;; ) { + int ret = read(sock, buf, 65536); + if (ret == 0) + break; + + // FIXME: update stats here + } + + printf("Socket %u done\n", sock); + + if (close(sock) == -1) { + perror("close()"); + exit(1); + } + + pthread_exit(0); +} + +int get_server_socket(unsigned short port) +{ + int server_sock; + struct sockaddr_in sin; + unsigned one = 1; + + server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if (server_sock == -1) { perror("socket()"); exit(1); } + if (setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) { + perror("setsocket(SO_REUSEADDR)"); + exit(1); + } + + sin.sin_family = AF_INET; + sin.sin_port = htons(port); + sin.sin_addr.s_addr = INADDR_ANY; + + if (bind(server_sock, (struct sockaddr *)&sin, sizeof(struct sockaddr)) == -1) { + perror("bind()"); + exit(1); + } + + if (listen(server_sock, 255) == -1) { + perror("listen()"); + exit(1); + } + + return server_sock; +} + +int main() +{ + int server_sock = get_server_socket(2007); + + // FIXME: fire off sender workers here + + /* + * Listen for incoming connections, spawning off one receiver + * thread for each (which will just gobble up the data until + * we're done). + */ + for ( ;; ) { + struct sockaddr_in addr; + socklen_t addr_len = sizeof(addr); + pthread_t thread; + + int sock = accept(server_sock, (struct sockaddr *)&addr, &addr_len); + if (sock == -1) { + perror("accept()"); + exit(1); + } + + if (pthread_create(&thread, NULL, receiver_worker, (void *)sock) == -1) { + perror("pthread_create()"); + exit(1); + } + } + exit(0); }