X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=examples%2Fmanynodes.c;h=0089c206a62989e2cd2a317e657416b280592875;hb=196806f90f40fcc0cf727abd4bed6bc5aefff5ff;hp=7b23fc5197f14aa7a7e19f9d59cac1cd1ee54d36;hpb=01eaeb3c9fa60ae9c6e5b866acd9baef79622d99;p=meshlink diff --git a/examples/manynodes.c b/examples/manynodes.c index 7b23fc51..0089c206 100644 --- a/examples/manynodes.c +++ b/examples/manynodes.c @@ -4,7 +4,12 @@ #include #include #include + +#if !defined(_WIN32) && !defined(__APPLE__) #include +#elif defined(__APPLE__) +#include +#endif #include "../src/meshlink.h" #include "../src/devtools.h" @@ -18,7 +23,7 @@ static int n = 10; static meshlink_handle_t **mesh; - +static char* namesprefix="machine1"; static int nodeindex = 0; static meshlink_node_t **nodes; @@ -36,24 +41,23 @@ static void log_message(meshlink_handle_t *mesh, meshlink_log_level_t level, con } //Test mesh sending data -static void testmesh () { +static void testmesh() { for(int nindex = 0; nindex < n; nindex++) { - nodes = meshlink_get_all_nodes(mesh[nindex], nodes, &nnodes); - if(!nodes) { - fprintf(stderr, "Could not get list of nodes: %s\n", meshlink_strerror(meshlink_errno)); - } else { - printf("%zu known nodes:\n", nnodes); - for(int i = 0; i < nnodes; i++) { - //printf(" %s\n", nodes[i]->name); - if(!meshlink_send(mesh[nindex], nodes[i], "magic", strlen("magic") + 1)) { - fprintf(stderr, "Could not send message to '%s': %s\n", nodes[i]->name, meshlink_strerror(meshlink_errno)); - } - } - + nodes = meshlink_get_all_nodes(mesh[nindex], nodes, &nnodes); + if(!nodes) + fprintf(stderr, "Could not get list of nodes: %s\n", meshlink_strerror(meshlink_errno)); + else { + printf("%zu known nodes:\n", nnodes); + for(int i = 0; i < nnodes; i++) { + //printf(" %s\n", nodes[i]->name); + if(!meshlink_send(mesh[nindex], nodes[i], "magic", strlen("magic") + 1)) + fprintf(stderr, "Could not send message to '%s': %s\n", nodes[i]->name, meshlink_strerror(meshlink_errno)); } + } + } } // Make all nodes know about each other by importing each others public keys and addresses. @@ -72,31 +76,27 @@ static void linkmesh() { } } -static bool exportmeshgraph(const char* path) -{ +static bool exportmeshgraph(const char* path) { struct stat ps; int psr = stat(path, &ps); - if(psr == 0 || errno != ENOENT) - { + if(psr == 0 || errno != ENOENT) { if(psr == -1) - { perror("stat"); } + perror("stat"); else - { fprintf(stderr, "%s exists already\n", path); } + fprintf(stderr, "%s exists already\n", path); return false; } FILE* stream = fopen(path, "w"); - if(!stream) - { + if(!stream) { perror("stream"); return false; } - if(!devtool_export_json_all_edges_state(mesh[nodeindex], stream)) - { + if(!devtool_export_json_all_edges_state(mesh[0], stream)) { fclose(stream); fprintf(stderr, "could not export graph\n"); return false; @@ -107,39 +107,36 @@ static bool exportmeshgraph(const char* path) } -void exportmeshgraph_timer(int signum) -{ +void exportmeshgraph_timer(int signum) { struct timeval ts; gettimeofday(&ts, NULL); char name[1024]; - snprintf(name, sizeof(name), "graph_%ld_%03ld.json", ts.tv_sec, ts.tv_usec/1000); + snprintf(name, sizeof(name), "%sgraph_%ld_%03ld.json", namesprefix,ts.tv_sec, ts.tv_usec/1000); exportmeshgraph(name); } +#ifndef _WIN32 static bool exportmeshgraph_started = false; -static bool exportmeshgraph_end(const char* none) -{ +static bool exportmeshgraph_end(const char* none) { if(!exportmeshgraph_started) - { return false; } + return false; struct itimerval zero_timer = { 0 }; - setitimer (ITIMER_REAL, &zero_timer, NULL); + setitimer(ITIMER_REAL, &zero_timer, NULL); exportmeshgraph_started = false; return true; } -static bool exportmeshgraph_begin(const char* timeout_str) -{ +static bool exportmeshgraph_begin(const char* timeout_str) { if(!timeout_str) return false; - if(exportmeshgraph_started) - { + if(exportmeshgraph_started) { if(!exportmeshgraph_end(NULL)) return false; } @@ -148,7 +145,7 @@ static bool exportmeshgraph_begin(const char* timeout_str) int timeout = atoi(timeout_str); if(timeout < 100) - { timeout = 100; } + timeout = 100; int timeout_sec = timeout / 1000; int timeout_msec = timeout % 1000; @@ -166,12 +163,21 @@ static bool exportmeshgraph_begin(const char* timeout_str) timer.it_interval.tv_usec = timeout_msec * 1000; /* Start a real timer. */ - setitimer (ITIMER_REAL, &timer, NULL); + setitimer(ITIMER_REAL, &timer, NULL); exportmeshgraph_started = true; return true; } +#else +static bool exportmeshgraph_end(const char* none) { + return false; +} + +static bool exportmeshgraph_begin(const char* timeout_str) { + return false; +} +#endif static void parse_command(char *buf) { char *arg = strchr(buf, ' '); @@ -202,9 +208,11 @@ static void parse_command(char *buf) { meshlink_stop(mesh[nodeindex]); if(!meshlink_join(mesh[nodeindex], arg)) fprintf(stderr, "Could not join using invitation: %s\n", meshlink_strerror(meshlink_errno)); - else { + else fprintf(stderr, "Invitation accepted!\n"); - meshlink_start(mesh[nodeindex]); + if(!meshlink_start(mesh[nodeindex])) { + fprintf(stderr, "Could not restart MeshLink: %s\n", meshlink_strerror(meshlink_errno)); + exit(1); } } else if(!strcasecmp(buf, "kick")) { if(!arg) { @@ -224,9 +232,9 @@ static void parse_command(char *buf) { } else if(!strcasecmp(buf, "who")) { if(!arg) { nodes = meshlink_get_all_nodes(mesh[nodeindex], nodes, &nnodes); - if(!nodes) { + if(!nodes) fprintf(stderr, "Could not get list of nodes: %s\n", meshlink_strerror(meshlink_errno)); - } else { + else { printf("%zu known nodes:", nnodes); for(int i = 0; i < nnodes; i++) printf(" %s", nodes[i]->name); @@ -234,50 +242,50 @@ static void parse_command(char *buf) { } } else { meshlink_node_t *node = meshlink_get_node(mesh[nodeindex], arg); - if(!node) { + if(!node) fprintf(stderr, "Unknown node '%s'\n", arg); - } else { + else printf("Node %s found, pmtu %zd\n", arg, meshlink_get_pmtu(mesh[nodeindex], node)); - } } - } else if(!strcasecmp(buf, "link")) { + } else if(!strcasecmp(buf, "link")) linkmesh(); - } else if(!strcasecmp(buf, "eg")) { + else if(!strcasecmp(buf, "eg")) exportmeshgraph(arg); - } else if(!strcasecmp(buf, "egb")) { + else if(!strcasecmp(buf, "egb")) exportmeshgraph_begin(arg); - } else if(!strcasecmp(buf, "ege")) { + else if(!strcasecmp(buf, "ege")) exportmeshgraph_end(NULL); - } else if(!strcasecmp(buf, "test")) { + else if(!strcasecmp(buf, "test")) testmesh(); - } else if(!strcasecmp(buf, "select")) { + else if(!strcasecmp(buf, "select")) { if(!arg) { fprintf(stderr, "/select requires an argument!\n"); return; } nodeindex = atoi(arg); printf("Index is now %d\n",nodeindex); - - } else if(!strcasecmp(buf, "quit")) { + } else if(!strcasecmp(buf, "stop")) + meshlink_stop(mesh[nodeindex]); + else if(!strcasecmp(buf, "quit")) { printf("Bye!\n"); fclose(stdin); } else if(!strcasecmp(buf, "help")) { printf( - ": Send a message to the given node.\n" - " Subsequent messages don't need the : prefix.\n" - "/invite Create an invitation for a new node.\n" - "/join Join an existing mesh using an invitation.\n" - "/kick Blacklist the given node.\n" - "/who [] List all nodes or show information about the given node.\n" - "/link Link all nodes together.\n" - "/eg Export graph as json file.\n" - "/test Test functionality sending some data to all nodes\n" - "/select Select the active node running the user commands\n" - "/quit Exit this program.\n" - ); - } else { + ": Send a message to the given node.\n" + " Subsequent messages don't need the : prefix.\n" + "/invite Create an invitation for a new node.\n" + "/join Join an existing mesh using an invitation.\n" + "/kick Blacklist the given node.\n" + "/who [] List all nodes or show information about the given node.\n" + "/link Link all nodes together.\n" + "/eg Export graph as json file.\n" + "/test Test functionality sending some data to all nodes\n" + "/select Select the active node running the user commands\n" + "/stop Call meshlink_stop, use /select first to select which node to stop\n" + "/quit Exit this program.\n" + ); + } else fprintf(stderr, "Unknown command '/%s'\n", buf); - } } static void parse_input(char *buf) { @@ -340,7 +348,6 @@ static void parse_input(char *buf) { int main(int argc, char *argv[]) { const char *basebase = ".manynodes"; - const char *namesprefix = "machine1"; const char *graphexporttimeout = NULL; char buf[1024]; @@ -363,8 +370,12 @@ int main(int argc, char *argv[]) { mesh = calloc(n, sizeof *mesh); - meshlink_set_log_cb(NULL, MESHLINK_WARNING, log_message); + meshlink_set_log_cb(NULL, MESHLINK_DEBUG, log_message); +#ifndef _WIN32 mkdir(basebase, 0750); +#else + mkdir(basebase); +#endif char filename[PATH_MAX]; char nodename[100]; @@ -372,8 +383,11 @@ int main(int argc, char *argv[]) { snprintf(nodename, sizeof nodename, "%snode%d", namesprefix,i); snprintf(filename, sizeof filename, "%s/%s", basebase, nodename); bool itsnew = access(filename, R_OK); - mesh[i] = meshlink_open(filename, nodename, "manynodes", i%_DEV_CLASS_MAX); - meshlink_set_log_cb(mesh[i], MESHLINK_WARNING, log_message); + if(n/(i+1) > n/4) + mesh[i] = meshlink_open(filename, nodename, "manynodes", DEV_CLASS_BACKBONE); + else + mesh[i] = meshlink_open(filename, nodename, "manynodes", DEV_CLASS_PORTABLE); + meshlink_set_log_cb(mesh[i], MESHLINK_DEBUG, log_message); if(!mesh[i]) { fprintf(stderr, "errno is: %d\n", meshlink_errno); fprintf(stderr, "Could not open %s: %s\n", filename, meshlink_strerror(meshlink_errno)); @@ -396,7 +410,7 @@ int main(int argc, char *argv[]) { } if(graphexporttimeout) - { exportmeshgraph_begin(graphexporttimeout); } + exportmeshgraph_begin(graphexporttimeout); printf("%d nodes started.\nType /help for a list of commands.\n", started);