X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=jam.c;h=e772fd9d9d4217725c5db903de8b505f80bab9ab;hb=e56014729532a37e05a977b85c9e3bbd3884cc75;hp=68ed2612ba214f7cf5d87f15cb0f7561efa01b8c;hpb=2bd0c6351fc96e58a77ee69684cebf65f30c539d;p=jam diff --git a/jam.c b/jam.c index 68ed261..e772fd9 100644 --- a/jam.c +++ b/jam.c @@ -1,13 +1,40 @@ #include #include +#include #include #include #include +void *receiver_worker(void *arg) +{ + 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) { @@ -15,6 +42,11 @@ int get_server_socket(unsigned short port) 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; @@ -24,6 +56,11 @@ int get_server_socket(unsigned short port) exit(1); } + if (listen(server_sock, 255) == -1) { + perror("listen()"); + exit(1); + } + return server_sock; } @@ -31,5 +68,29 @@ 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); }