]> git.sesse.net Git - jam/blob - jam.c
Add a loop listening for new connections.
[jam] / jam.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <pthread.h>
4 #include <sys/socket.h>
5 #include <netinet/in.h>
6
7 void *receiver_worker(void *arg)
8 {
9         int sock = (int)arg;
10         printf("Received worker for socket %u\n", sock);
11         pthread_exit(0);
12 }
13
14 int get_server_socket(unsigned short port)
15 {
16         int server_sock;
17         struct sockaddr_in sin;
18
19         server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
20         if (server_sock == -1) {
21                 perror("socket()");
22                 exit(1);
23         }
24
25         sin.sin_family = AF_INET;
26         sin.sin_port = htons(port);
27         sin.sin_addr.s_addr = INADDR_ANY;
28
29         if (bind(server_sock, (struct sockaddr *)&sin, sizeof(struct sockaddr)) == -1) {
30                 perror("bind()");
31                 exit(1);
32         }
33
34         if (listen(server_sock, 255) == -1) {
35                 perror("listen()");
36                 exit(1);
37         }
38
39         return server_sock;
40 }
41
42 int main()
43 {
44         int server_sock = get_server_socket(2007);
45
46         // FIXME: fire off sender workers here
47
48         /*
49          * Listen for incoming connections, spawning off one receiver
50          * thread for each (which will just gobble up the data until
51          * we're done).
52          */
53         for ( ;; ) {
54                 struct sockaddr_in addr;
55                 socklen_t addr_len = sizeof(addr);
56                 pthread_t thread;
57
58                 int sock = accept(server_sock, (struct sockaddr *)&addr, &addr_len);
59                 if (sock == -1) {
60                         perror("accept()");
61                         exit(1);
62                 }
63
64                 pthread_create(&thread, NULL, receiver_worker, (void *)sock);
65         }
66
67         exit(0);
68 }