6 #include <sys/socket.h>
7 #include <netinet/in.h>
9 const static struct option longopts[] = {
10 { "destination-file", required_argument, NULL, 'd' },
14 void read_destination_list(char *filename)
19 void parse_options(int argc, char **argv)
24 int c = getopt_long(argc, argv, "d:", longopts, &option_index);
27 read_destination_list(optarg);
30 return; // end of argument list
32 fprintf(stderr, "Invalid option\n");
38 void *receiver_worker(void *arg)
43 printf("Received worker for socket %u\n", sock);
46 int ret = read(sock, buf, 65536);
50 // FIXME: update stats here
53 printf("Socket %u done\n", sock);
55 if (close(sock) == -1) {
63 int get_server_socket(unsigned short port)
66 struct sockaddr_in sin;
69 server_sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
70 if (server_sock == -1) {
75 if (setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)) == -1) {
76 perror("setsocket(SO_REUSEADDR)");
80 sin.sin_family = AF_INET;
81 sin.sin_port = htons(port);
82 sin.sin_addr.s_addr = INADDR_ANY;
84 if (bind(server_sock, (struct sockaddr *)&sin, sizeof(struct sockaddr)) == -1) {
89 if (listen(server_sock, 255) == -1) {
97 int main(int argc, char **argv)
101 parse_options(argc, argv);
102 server_sock = get_server_socket(2007);
104 // FIXME: fire off sender workers here
107 * Listen for incoming connections, spawning off one receiver
108 * thread for each (which will just gobble up the data until
112 struct sockaddr_in addr;
113 socklen_t addr_len = sizeof(addr);
117 int sock = accept(server_sock, (struct sockaddr *)&addr, &addr_len);
123 // FIXME: these do not really set errno
124 if (pthread_attr_init(&attr) != 0) {
125 perror("pthread_attr_init()");
129 if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + 65536 + 0x4000) != 0) {
130 perror("pthread_attr_setstacksize");
134 if (pthread_create(&thread, &attr, receiver_worker, (void *)sock) != 0) {
135 perror("pthread_create()");