summaryrefslogtreecommitdiff
path: root/mcastseed/src/mcastseed.c
diff options
context:
space:
mode:
Diffstat (limited to 'mcastseed/src/mcastseed.c')
-rw-r--r--mcastseed/src/mcastseed.c94
1 files changed, 62 insertions, 32 deletions
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 <ludovic@pouzenc.fr>
+ *
* 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 <dontmind@freeshell.org>.
*/
+#define _GNU_SOURCE /* See feature_test_macros(7) */
-#ifndef __MINGW32__
-#include <unistd.h> /* for usleep() */
-#endif
-#include <stdio.h>
-#include <stdlib.h>
+#include <unistd.h> /* close() */
+#include <stdio.h> /* fprintf(), stderr */
+#include <stdlib.h> /* 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;
+ }
+ }
+}
+