X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=jam.c;h=3b38d0217587f00d08e319eee7a1f5191f190599;hb=32c853ee6bd73470050fde54e1f6a819f2a392c0;hp=5047d286cfc417c4b2fd9bb62a6ef9d3f4d3a311;hpb=898657c132bb723f9f4da57bbe9d75ebb891f7cb;p=jam diff --git a/jam.c b/jam.c index 5047d28..3b38d02 100644 --- a/jam.c +++ b/jam.c @@ -18,9 +18,12 @@ struct in_addr *sources = NULL; unsigned num_sources = 0; unsigned room_sources = 0; +unsigned num_senders = 128; + const static struct option longopts[] = { - { "source-file", required_argument, NULL, 's' }, - { "destination-file", required_argument, NULL, 'd' }, + { "source-list", required_argument, NULL, 's' }, + { "destination-list", required_argument, NULL, 'd' }, + { "num-senders", required_argument, NULL, 'n' }, { "port", required_argument, NULL, 'p' }, { NULL, 0, NULL, 0 } }; @@ -85,7 +88,7 @@ void parse_options(int argc, char **argv) int option_index = 0; for ( ;; ) { - int c = getopt_long(argc, argv, "s:d:p:", longopts, &option_index); + int c = getopt_long(argc, argv, "s:d:n:p:", longopts, &option_index); switch (c) { case 's': read_ip_list(optarg, &sources, &num_sources, &room_sources); @@ -93,6 +96,9 @@ void parse_options(int argc, char **argv) case 'd': read_ip_list(optarg, &destinations, &num_destinations, &room_destinations); break; + case 'n': + num_senders = atoi(optarg); + break; case 'p': port = atoi(optarg); break; @@ -105,6 +111,12 @@ void parse_options(int argc, char **argv) } } +void *sender_worker(void *arg) +{ + printf("Dummy sender worker\n"); + pthread_exit(0); +} + void *receiver_worker(void *arg) { int sock = (int)arg; @@ -167,11 +179,40 @@ int get_server_socket(unsigned short port) int main(int argc, char **argv) { int server_sock; + unsigned i; + pthread_attr_t attr; parse_options(argc, argv); + + if (destinations == NULL || sources == NULL) { + fprintf(stderr, "Missing or empty source or destination host list. Aborting.\n"); + } + server_sock = get_server_socket(port); + + printf("Sending data on port %u from %u sources to %u destinations.\n\n", + port, num_sources, num_destinations); + + // FIXME: these do not really set errno + if (pthread_attr_init(&attr) != 0) { + perror("pthread_attr_init()"); + exit(1); + } + + if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + 65536 + 0x4000) != 0) { + perror("pthread_attr_setstacksize"); + exit(1); + } - // FIXME: fire off sender workers here + // Fire off sender workers. + for (i = 0; i < num_senders; ++i) { + pthread_t thread; + + if (pthread_create(&thread, &attr, sender_worker, NULL) != 0) { + perror("pthread_create()"); + exit(1); + } + } /* * Listen for incoming connections, spawning off one receiver @@ -182,7 +223,6 @@ int main(int argc, char **argv) struct sockaddr_in addr; socklen_t addr_len = sizeof(addr); pthread_t thread; - pthread_attr_t attr; int sock = accept(server_sock, (struct sockaddr *)&addr, &addr_len); if (sock == -1) { @@ -190,17 +230,6 @@ int main(int argc, char **argv) exit(1); } - // FIXME: these do not really set errno - if (pthread_attr_init(&attr) != 0) { - perror("pthread_attr_init()"); - exit(1); - } - - if (pthread_attr_setstacksize(&attr, PTHREAD_STACK_MIN + 65536 + 0x4000) != 0) { - perror("pthread_attr_setstacksize"); - exit(1); - } - if (pthread_create(&thread, &attr, receiver_worker, (void *)sock) != 0) { perror("pthread_create()"); exit(1);