From 4e05e2ffe67e922980dd9efda6790ccdfcda6ac4 Mon Sep 17 00:00:00 2001 From: Ludovic Pouzenc Date: Sun, 3 Jul 2016 10:46:30 +0200 Subject: Refactor, keep tracing on stderr, corrections for iovec size and dup dgram handling. --- mcastseed/src/mcastseed.c | 94 +++++++++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 32 deletions(-) (limited to 'mcastseed/src/mcastseed.c') diff --git a/mcastseed/src/mcastseed.c b/mcastseed/src/mcastseed.c index f86af84..276ed92 100644 --- a/mcastseed/src/mcastseed.c +++ b/mcastseed/src/mcastseed.c @@ -1,19 +1,22 @@ -/* server.c +/* + * mcastseed.c - Multicast sender for huge streams to be piped to other programs (partitions cloning) + * + * Copyright 2016 by Ludovic Pouzenc + * * Greatly inspired from examples written by tmouse, July 2005 * http://cboard.cprogramming.com/showthread.php?t=67469 - * Modified to run multi-platform by Christian Beier . */ +#define _GNU_SOURCE /* See feature_test_macros(7) */ -#ifndef __MINGW32__ -#include /* for usleep() */ -#endif -#include -#include +#include /* close() */ +#include /* fprintf(), stderr */ +#include /* atoi(), EXIT_SUCCESS */ #include "msock.h" #define READ_BUF_LEN 256 #define MAX_PENDING_CONNECTIONS 256 #define MAX_CLIENTS 256 + #define DEFAULT_MCAST_IP_STR "ff02::114" #define DEFAULT_PORT_STR "9000" #define DEFAULT_MCAST_TTL 1 @@ -42,7 +45,7 @@ char readbuf[READ_BUF_LEN]; /* Strings to print out representation of various states of the program */ const char * const state_str[] = { - "exiting", + "start", "send_hello", "accept_pending_clients_or_wait_a_bit", "start_job", @@ -55,8 +58,9 @@ const char * const state_str[] = { void die(char* msg); void usage(char *msg); void arg_parse(int argc, char* argv[]); -void unsetup_sockets(); +void fsm_trace(int state); void setup_sockets(); +void unsetup_sockets(); /* Parts of the "protocol", definitions are after main() */ int send_hello(); @@ -74,7 +78,7 @@ int main(int argc, char *argv[]) { /* Finite state machine */ while ( state > 0 ) { - fprintf(stderr, "Now in %s state\n", state_str[state]); + fsm_trace(state); switch ( state ) { case 1: res = send_hello(); state = (res==0)?2:-1; break; case 2: res = accept_pending_clients_or_wait_a_bit(); @@ -105,6 +109,7 @@ int main(int argc, char *argv[]) { break; } } + fsm_trace(state); unsetup_sockets(); @@ -261,24 +266,34 @@ int start_job() { return 0; } +void send_fake(char buf[], int paylen, int i) { + *( (uint32_t *) buf+1 ) = htonl(i); + snprintf(buf+29, 5, "%04i", i); + *( (char *) buf+33 ) = ')'; + sendto(mcast_sock, buf, 8+paylen, 0, mcast_addr->ai_addr, mcast_addr->ai_addrlen); +} int send_data() { ssize_t nwrite; - char buf[] = "dataXXXXJe suis à la plage."; + char buf[] = "dataXXXXJe suis à la plage (XXXX).\n"; int paylen = strlen(buf)-8; - int seq = 1; + int i; //XXX Dummy - *( (uint32_t *) buf+1 ) = htonl(3); - sendto(mcast_sock, buf, 8+paylen, 0, mcast_addr->ai_addr, mcast_addr->ai_addrlen); - *( (uint32_t *) buf+1 ) = htonl(4); - sendto(mcast_sock, buf, 8+paylen, 0, mcast_addr->ai_addr, mcast_addr->ai_addrlen); - *( (uint32_t *) buf+1 ) = htonl(2); - sendto(mcast_sock, buf, 8+paylen, 0, mcast_addr->ai_addr, mcast_addr->ai_addrlen); - - - *( (uint32_t *) buf+1 ) = htonl(seq); + send_fake(buf, paylen, 5); + send_fake(buf, paylen, 4); + for (i=6; i<=300; i+=2) { + send_fake(buf, paylen, i); + } + for (i=7; i<=300; i+=2) { + send_fake(buf, paylen, i); + } + send_fake(buf, paylen, 1); + send_fake(buf, paylen, 1); + send_fake(buf, paylen, 2); + *( (uint32_t *) buf+1 ) = htonl(3); + buf[22]='m', buf[23]='e', buf[24]='r'; buf[25]='.'; buf[26]='\n'; paylen = 19; nwrite = sendto(mcast_sock, buf, 8+paylen, 0, mcast_addr->ai_addr, mcast_addr->ai_addrlen); if ( nwrite < 0 ) { perror("sendto() failed"); @@ -398,19 +413,18 @@ void arg_parse(int argc, char* argv[]) { mcast_ttl = 1; } -void unsetup_sockets() { - if ( ucast_sock > 0 ) { - close(ucast_sock); - ucast_sock = 0; - } +void fsm_trace(int state) { + static int prev_state = 0; - if ( mcast_sock > 0 ) { - close(mcast_sock); - mcast_sock = 0; - if ( mcast_addr ) { - freeaddrinfo(mcast_addr); - mcast_addr = 0; + if ( state < 0 ) { + fprintf(stderr, "Abnormal exit condition %i (from %s)", state, state_str[prev_state]); + } else if ( prev_state != state) { + if ( state == 0 ) { + fprintf(stderr, "Normal exit (from %s)\n", state_str[prev_state]); + } else { + fprintf(stderr, "Now in %s (from %s)\n", state_str[state], state_str[prev_state]); } + prev_state = state; } } @@ -426,3 +440,19 @@ void setup_sockets() { usage("Could not setup multicast socket. Wrong args given ?"); } +void unsetup_sockets() { + if ( ucast_sock > 0 ) { + close(ucast_sock); + ucast_sock = 0; + } + + if ( mcast_sock > 0 ) { + close(mcast_sock); + mcast_sock = 0; + if ( mcast_addr ) { + freeaddrinfo(mcast_addr); + mcast_addr = 0; + } + } +} + -- cgit v1.2.3