| | |
| | | #include <getopt.h> |
| | | |
| | | typedef struct Targ { |
| | | int port; |
| | | char *sendlist; |
| | | int id; |
| | | |
| | | }Targ; |
| | | |
| | | struct argument_t { |
| | | char *fun; |
| | | int port; |
| | | int key; |
| | | char *sendlist; |
| | | char *publist; |
| | | char **cmd_arr; |
| | | int cmd_arr_len; |
| | | }; |
| | | |
| | | argument_t parse_args (int argc, char *argv[]); |
| | | void usage(char *name); |
| | | int parse_node_list(char *str, net_node_t *node_arr_addr[]) ; |
| | | void print_node_list(net_node_t *node_arr, int len); |
| | | |
| | | void start_net_proxy(int port) { |
| | | printf("Start net proxy\n"); |
| | |
| | | } |
| | | } |
| | | |
| | | void start_net_client(int port ){ |
| | | |
| | | void *print_sub_msg(void *sockt) { |
| | | pthread_detach(pthread_self()); |
| | | void *recvbuf; |
| | | int size; |
| | | int key; |
| | | while (net_mod_socket_recvfrom( sockt, &recvbuf, &size, &key) == 0) { |
| | | printf("收到订阅消息:%s\n", recvbuf); |
| | | free(recvbuf); |
| | | } |
| | | |
| | | } |
| | | |
| | | void start_net_client(char *sendlist, char*publist ){ |
| | | void * client = net_mod_socket_open(); |
| | | char content[MAXLINE]; |
| | | char action[512]; |
| | |
| | | int buskey; |
| | | |
| | | int recv_arr_size, i, n; |
| | | |
| | | |
| | | net_mod_recv_msg_t *recv_arr; |
| | | //192.168.20.104 |
| | | int node_arr_size = 3; |
| | | net_node_t node_arr[] = { |
| | | {"192.168.5.22", port, 11}, |
| | | {"192.168.20.10", port, 11}, |
| | | {"192.168.20.104", port, 11} |
| | | }; |
| | | |
| | | int pub_node_arr_size = 3; |
| | | net_node_t pub_node_arr[] = { |
| | | {"192.168.5.22", port, 8}, |
| | | {"192.168.20.10", port, 8}, |
| | | {"192.168.20.104", port, 8} |
| | | }; |
| | | pthread_t tid; |
| | | pthread_create(&tid, NULL, print_sub_msg, client); |
| | | |
| | | //192.168.5.10:5000:11, 192.168.5.22:5000:11, 192.168.5.104:5000:11 |
| | | net_node_t *node_arr; |
| | | int node_arr_size = parse_node_list(sendlist, &node_arr); |
| | | // print_node_list(node_arr, node_arr_size); |
| | | |
| | | //192.168.5.10:5000:8, 192.168.5.22:5000:8, 192.168.5.104:5000:8 |
| | | net_node_t *pub_node_arr; |
| | | int pub_node_arr_size = parse_node_list(publist, &pub_node_arr); |
| | | // print_node_list(pub_node_arr, pub_node_arr_size); |
| | | |
| | | while (true) { |
| | | //printf("Usage: pub <topic> [content] or sub <topic>\n"); |
| | | printf("Can I help you? pub, send or quit\n"); |
| | | printf("Can I help you? pub,sub,desub,send or quit\n"); |
| | | scanf("%s",action); |
| | | |
| | | if(strcmp(action, "pub") == 0) { |
| | |
| | | |
| | | if (fgets(content, MAXLINE, stdin) != NULL) { |
| | | // 收到消息的节点即使没有对应的信息, 也要回复一个表示无的消息,否则会一直等待 |
| | | n = net_mod_socket_sendandrecv(client, node_arr, node_arr_size, content, strlen(content), &recv_arr, &recv_arr_size); |
| | | n = net_mod_socket_sendandrecv_timeout(client, node_arr, node_arr_size, content, |
| | | strlen(content), &recv_arr, &recv_arr_size, 5000); |
| | | printf("send %d nodes\n", n); |
| | | for(i=0; i<recv_arr_size; i++) { |
| | | printf("host:%s, port: %d, key:%d, content: %s\n", |
| | |
| | | } |
| | | } |
| | | else if(strcmp(action, "desub") == 0) { |
| | | printf("Please input buskey topic!\n"); |
| | | printf("Please input buskey and topic!\n"); |
| | | |
| | | scanf("%d %s", buskey, topic); |
| | | scanf("%d %s", &buskey, topic); |
| | | if (net_mod_socket_desub(client, topic, strlen(topic), buskey) == 0) { |
| | | printf("%d Desub success!\n", net_mod_socket_get_key(client)); |
| | | } else { |
| | |
| | | |
| | | } |
| | | else if(strcmp(action, "sub") == 0) { |
| | | printf("Please input topic!\n"); |
| | | scanf("%s", topic); |
| | | printf("Please input buskey and topic!\n"); |
| | | scanf("%d %s",&buskey, topic); |
| | | |
| | | printf("===%d %s\n",buskey, topic); |
| | | if (net_mod_socket_sub(client, topic, strlen(topic), buskey) == 0) { |
| | | printf("%d Sub success!\n", net_mod_socket_get_key(client)); |
| | | } else { |
| | |
| | | |
| | | void *runclient(void *arg) { |
| | | Targ *targ = (Targ *)arg; |
| | | int port = targ->port; |
| | | char sendbuf[512]; |
| | | |
| | | int i,j, n, recv_arr_size; |
| | | net_mod_recv_msg_t *recv_arr; |
| | | |
| | | int node_arr_size = 1; |
| | | //192.168.20.104 |
| | | net_node_t node_arr[] = { |
| | | //{0, port, 11} |
| | | {"192.168.20.10", port, 11} |
| | | // {"192.168.20.104", port, 11} |
| | | }; |
| | | |
| | | |
| | | net_node_t *node_arr; |
| | | int node_arr_size = parse_node_list(targ->sendlist, &node_arr); |
| | | |
| | | void * client = net_mod_socket_open(); |
| | | |
| | |
| | | return (void *)i; |
| | | } |
| | | |
| | | void start_net_mclient(int port) { |
| | | void start_net_mclient(char *sendlist) { |
| | | |
| | | int status, i = 0, processors = 1; |
| | | int status, i = 0, processors = 4; |
| | | void *res[processors]; |
| | | // Targ *targs = (Targ *)calloc(processors, sizeof(Targ)); |
| | | Targ targs[processors]; |
| | |
| | | printf("开始测试...\n"); |
| | | gettimeofday(&start, NULL); |
| | | for (i = 0; i < processors; i++) { |
| | | targs[i].port = port; |
| | | targs[i].sendlist = sendlist; |
| | | targs[i].id = i; |
| | | pthread_create(&tids[i], NULL, runclient, (void *)&targs[i]); |
| | | } |
| | |
| | | |
| | | |
| | | void start_reply(int key) { |
| | | printf("start reply\n"); |
| | | void *socket = net_mod_socket_open(); |
| | | net_mod_socket_bind(socket, key); |
| | | int size; |
| | |
| | | |
| | | |
| | | |
| | | void usage(char *name) |
| | | { |
| | | fprintf(stderr, "Usage: %s [OPTIONS] [ARG...]\n\n", name); |
| | | fprintf(stderr, "Test net mod socket\n\n"); |
| | | fprintf(stderr, "Options:\n\n"); |
| | | #define fpe(str) fprintf(stderr, " %s", str); |
| | | fpe("-f, --funciton Function name\n"); |
| | | fpe("-p, --port TCP/IP Port\n"); |
| | | fpe("-k, --key SHM Key\n"); |
| | | fpe("\n"); |
| | | } |
| | | |
| | | struct argument_t { |
| | | char *fun; |
| | | int port; |
| | | int key; |
| | | char **cmd_arr; |
| | | int cmd_arr_len; |
| | | }; |
| | | |
| | | argument_t parse_args (int argc, char *argv[]) |
| | | { |
| | | int c; |
| | | |
| | | if(argc < 2) { |
| | | usage(argv[0]); |
| | | exit(1); |
| | | } |
| | | |
| | | if(argc == 2 && strcmp(argv[1], "--help") == 0) { |
| | | usage(argv[0]); |
| | | exit(0); |
| | | } |
| | | |
| | | |
| | | argument_t mopt = {}; |
| | | |
| | | // mopt.volume_list_size = 0; |
| | | |
| | | opterr = 0; |
| | | |
| | | static struct option long_options[] = |
| | | { |
| | | /* These options set a flag. */ |
| | | |
| | | {"fun", required_argument, 0, 'f'}, |
| | | {"key", required_argument, 0, 'k'}, |
| | | {"port", required_argument, 0, 'p'}, |
| | | {0, 0, 0, 0} |
| | | }; |
| | | /* getopt_long stores the option index here. */ |
| | | int option_index = 0; |
| | | while (1) |
| | | { |
| | | |
| | | |
| | | c = getopt_long (argc, argv, "+f:k:p:", long_options, &option_index); |
| | | |
| | | /* Detect the end of the options. */ |
| | | if (c == -1) |
| | | break; |
| | | |
| | | switch (c) |
| | | { |
| | | case 0: |
| | | // printf("ffffffff\n"); |
| | | /* If this option set a flag, do nothing else now. */ |
| | | if (long_options[option_index].flag != 0) |
| | | break; |
| | | printf ("option %s", long_options[option_index].name); |
| | | if (optarg) |
| | | printf (" with arg %s", optarg); |
| | | printf ("\n"); |
| | | break; |
| | | |
| | | case 'f': |
| | | mopt.fun = optarg; |
| | | break; |
| | | |
| | | case 'k': |
| | | mopt.key = atoi(optarg); |
| | | break; |
| | | |
| | | case 'p': |
| | | // printf ("==name with value `%s'\n", optarg); |
| | | mopt.port = atoi(optarg); |
| | | break; |
| | | |
| | | case '?': |
| | | // printf ("==? optopt=%c, %s, `%s', %d\n", optopt, optarg, argv[optind], optind); |
| | | /* getopt_long already printed an error message. */ |
| | | usage(argv[0]); |
| | | exit(1); |
| | | break; |
| | | |
| | | default: |
| | | //printf ("==default optopt=%c, %s, `%s'\n",optopt, optarg, argv[optind]); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // printf ("optind = %d, argc=%d \n", optind, argc); |
| | | /* Print any remaining command line arguments (not options). */ |
| | | if (optind < argc) |
| | | { |
| | | mopt.cmd_arr = &argv[optind]; |
| | | mopt.cmd_arr_len = argc - optind; |
| | | // printf ("non-option ARGV-elements: "); |
| | | // while (optind < argc) |
| | | // printf ("%d, %d, %s \n", optind, argc, argv[optind++]); |
| | | // putchar ('\n'); |
| | | } |
| | | return mopt; |
| | | |
| | | } |
| | | int main(int argc, char *argv[]) { |
| | | shm_init(512); |
| | | |
| | |
| | | } |
| | | start_reply(opt.key); |
| | | } |
| | | |
| | | else if (strcmp("start_net_client", opt.fun) == 0) { |
| | | if(opt.port == 0) { |
| | | if(opt.sendlist == 0) { |
| | | fprintf(stderr, "Missing sendlist .\n"); |
| | | usage(argv[0]); |
| | | exit(1); |
| | | } |
| | | start_net_client(opt.port); |
| | | if(opt.publist == 0) { |
| | | fprintf(stderr, "Missing publist.\n"); |
| | | usage(argv[0]); |
| | | exit(1); |
| | | } |
| | | start_net_client(opt.sendlist, opt.publist); |
| | | } |
| | | else if (strcmp("start_net_mclient", opt.fun) == 0) { |
| | | if(opt.sendlist == 0) { |
| | | fprintf(stderr, "Missing sendlist .\n"); |
| | | usage(argv[0]); |
| | | exit(1); |
| | | } |
| | | |
| | | start_net_mclient(opt.sendlist); |
| | | } |
| | | else { |
| | | usage(argv[0]); |
| | |
| | | |
| | | } |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | void usage(char *name) |
| | | { |
| | | fprintf(stderr, "Usage: %s [OPTIONS] [ARG...]\n\n", name); |
| | | fprintf(stderr, "Test net mod socket\n\n"); |
| | | fprintf(stderr, "Options:\n\n"); |
| | | #define fpe(str) fprintf(stderr, " %s", str); |
| | | fpe("-f, --funciton Function name\n"); |
| | | fpe("-p, --port TCP/IP Port\n"); |
| | | fpe("-k, --key SHM Key\n"); |
| | | fpe("\n"); |
| | | } |
| | | |
| | | |
| | | |
| | | argument_t parse_args (int argc, char *argv[]) |
| | | { |
| | | int c; |
| | | |
| | | if(argc < 2) { |
| | | usage(argv[0]); |
| | | exit(1); |
| | | } |
| | | |
| | | if(argc == 2 && strcmp(argv[1], "--help") == 0) { |
| | | usage(argv[0]); |
| | | exit(0); |
| | | } |
| | | |
| | | |
| | | argument_t mopt = {}; |
| | | |
| | | // mopt.volume_list_size = 0; |
| | | |
| | | opterr = 0; |
| | | |
| | | |
| | | static struct option long_options[] = |
| | | { |
| | | /* These options set a flag. */ |
| | | |
| | | {"fun", required_argument, 0, 'f'}, |
| | | {"key", required_argument, 0, 'k'}, |
| | | {"port", required_argument, 0, 'p'}, |
| | | {"sendlist", required_argument, (int *)mopt.sendlist, 0}, |
| | | {"publist", required_argument, (int *)mopt.publist, 0}, |
| | | {0, 0, 0, 0} |
| | | }; |
| | | /* getopt_long stores the option index here. */ |
| | | int option_index = 0; |
| | | while (1) |
| | | { |
| | | |
| | | |
| | | c = getopt_long (argc, argv, "+f:k:p:", long_options, &option_index); |
| | | |
| | | /* Detect the end of the options. */ |
| | | if (c == -1) |
| | | break; |
| | | |
| | | switch (c) |
| | | { |
| | | case 0: |
| | | /* If this option set a flag, do nothing else now. */ |
| | | if (long_options[option_index].flag != 0) |
| | | break; |
| | | |
| | | if(strcmp(long_options[option_index].name, "sendlist") == 0) { |
| | | mopt.sendlist = optarg; |
| | | } |
| | | else if(strcmp(long_options[option_index].name, "publist") == 0) { |
| | | mopt.publist = optarg; |
| | | } |
| | | else { |
| | | printf ("option %s", long_options[option_index].name); |
| | | if (optarg) |
| | | printf (" with arg %s", optarg); |
| | | printf ("\n"); |
| | | } |
| | | |
| | | break; |
| | | |
| | | case 'f': |
| | | mopt.fun = optarg; |
| | | break; |
| | | |
| | | case 'k': |
| | | mopt.key = atoi(optarg); |
| | | break; |
| | | |
| | | case 'p': |
| | | // printf ("==name with value `%s'\n", optarg); |
| | | mopt.port = atoi(optarg); |
| | | break; |
| | | |
| | | case '?': |
| | | printf ("==? optopt=%c, %s, `%s', %d\n", optopt, optarg, argv[optind], optind); |
| | | /* getopt_long already printed an error message. */ |
| | | usage(argv[0]); |
| | | exit(1); |
| | | break; |
| | | |
| | | default: |
| | | //printf ("==default optopt=%c, %s, `%s'\n",optopt, optarg, argv[optind]); |
| | | break; |
| | | } |
| | | } |
| | | |
| | | // printf ("optind = %d, argc=%d \n", optind, argc); |
| | | /* Print any remaining command line arguments (not options). */ |
| | | if (optind < argc) |
| | | { |
| | | mopt.cmd_arr = &argv[optind]; |
| | | mopt.cmd_arr_len = argc - optind; |
| | | // printf ("non-option ARGV-elements: "); |
| | | // while (optind < argc) |
| | | // printf ("%d, %d, %s \n", optind, argc, argv[optind++]); |
| | | // putchar ('\n'); |
| | | } |
| | | return mopt; |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * @str "192.168.5.10:5000:11, 192.168.5.22:5000:11, 192.168.5.104:5000:11" |
| | | * @node_arr_addr 返回处理后的网络节点数组 |
| | | * { |
| | | * {"192.168.5.22", 5000, 11}, |
| | | * {"192.168.20.10", 5000, 11}, |
| | | * {"192.168.20.104", 5000, 11} |
| | | * } |
| | | * @return 数组的长度 |
| | | */ |
| | | int parse_node_list(char *str, net_node_t *node_arr_addr[]) { |
| | | int i, j; |
| | | char **property_arr; |
| | | int property_arr_len; |
| | | char **entry_arr; |
| | | int entry_arr_len = str_split(str, ",", &entry_arr); |
| | | |
| | | net_node_t *node_arr = (net_node_t *) calloc(entry_arr_len, sizeof(net_node_t)); |
| | | for(i = 0; i < entry_arr_len; i++) { |
| | | property_arr_len = str_split(entry_arr[i], ":", &property_arr); |
| | | node_arr[i] = {trim(property_arr[0], 0), atoi(property_arr[1]), atoi(property_arr[2])}; |
| | | free(entry_arr[i]); |
| | | free(property_arr[1]); |
| | | free(property_arr[2]); |
| | | } |
| | | *node_arr_addr = node_arr; |
| | | |
| | | |
| | | return entry_arr_len; |
| | | } |
| | | |
| | | void print_node_list(net_node_t *node_arr, int len) { |
| | | for(int i = 0; i < len; i++) { |
| | | printf("%s,%d,%d,\n", node_arr[i].host, node_arr[i].port, node_arr[i].key); |
| | | } |
| | | } |