int main(int argc, char *argv[]) { char buff[1024]; size_t len; fd_set rfds; struct timeval tv; struct knet_host_search print_search; if (argc < 3) { print_usage(argv[0]); exit(EXIT_FAILURE); } if (socketpair(AF_UNIX, SOCK_STREAM, IPPROTO_IP, knet_sock) != 0) { printf("Unable to create socket\n"); exit(EXIT_FAILURE); } knet_h = NULL; if (signal(SIGINT, sigint_handler) == SIG_ERR) { printf("Unable to configure SIGINT handler\n"); exit(EXIT_FAILURE); } if ((knet_h = knet_handle_new(knet_sock[0], 1)) == NULL) { printf("Unable to create new knet_handle_t\n"); exit(EXIT_FAILURE); } argv_to_hosts(argc, argv); knet_handle_setfwd(knet_h, 1); while (1) { knet_host_foreach(knet_h, print_link, &print_search); printf("Sending 'Hello World!' frame\n"); write(knet_sock[1], "Hello World!", 13); tv.tv_sec = 5; tv.tv_usec = 0; select_loop: FD_ZERO(&rfds); FD_SET(knet_sock[1], &rfds); len = select(FD_SETSIZE, &rfds, NULL, NULL, &tv); /* uncomment this to replicate the one-message problem */ /* usleep(500000); */ if (len < 0) { printf("Unable select over knet_handle_t\n"); exit(EXIT_FAILURE); } else if (FD_ISSET(knet_sock[1], &rfds)) { len = read(knet_sock[1], buff, sizeof(buff)); printf("Received data (%zu bytes): '%s'\n", len, buff); } if ((tv.tv_sec > 0) || (tv.tv_usec > 0)) goto select_loop; } /* FIXME: allocated hosts should be free'd */ return 0; }
int main(int argc, char *argv[]) { char buff[1024]; size_t len; fd_set rfds; struct timeval tv; struct knet_host_search print_search; int logpipefd[2]; if (argc < 3) { print_usage(argv[0]); exit(EXIT_FAILURE); } if (socketpair(AF_UNIX, SOCK_STREAM, IPPROTO_IP, knet_sock) != 0) { printf("Unable to create socket\n"); exit(EXIT_FAILURE); } if (pipe(logpipefd)) { printf("Unable to create log pipe\n"); exit(EXIT_FAILURE); } knet_h = NULL; if (signal(SIGINT, sigint_handler) == SIG_ERR) { printf("Unable to configure SIGINT handler\n"); exit(EXIT_FAILURE); } set_debug(argc, argv); memset(&knet_handle_cfg, 0, sizeof(struct knet_handle_cfg)); knet_handle_cfg.to_net_fd = knet_sock[0]; knet_handle_cfg.node_id = 1; knet_handle_cfg.log_fd = logpipefd[1]; knet_handle_cfg.default_log_level = loglevel; if ((knet_h = knet_handle_new(&knet_handle_cfg)) == NULL) { printf("Unable to create new knet_handle_t\n"); exit(EXIT_FAILURE); } if (set_crypto(argc, argv)) { memset(knet_handle_crypto_cfg.private_key, 0, KNET_MAX_KEY_LEN); knet_handle_crypto_cfg.private_key_len = KNET_MAX_KEY_LEN; if (knet_handle_crypto(knet_h, &knet_handle_crypto_cfg)) { printf("Unable to init crypto\n"); exit(EXIT_FAILURE); } } else { printf("Crypto not activated\n"); } argv_to_hosts(argc, argv); knet_handle_setfwd(knet_h, 1); while (1) { ssize_t wlen; knet_host_foreach(knet_h, print_link, &print_search); printf("Sending 'Hello World!' frame\n"); wlen = write(knet_sock[1], "Hello World!", 13); if (wlen != 13) printf("Unable to send Hello World! to socket!\n"); tv.tv_sec = 5; tv.tv_usec = 0; select_loop: FD_ZERO(&rfds); FD_SET(knet_sock[1], &rfds); FD_SET(logpipefd[0], &rfds); len = select(FD_SETSIZE, &rfds, NULL, NULL, &tv); /* uncomment this to replicate the one-message problem */ /* usleep(500000); */ if (len < 0) { printf("Unable select over knet_handle_t\n"); exit(EXIT_FAILURE); } else if (FD_ISSET(knet_sock[1], &rfds)) { len = read(knet_sock[1], buff, sizeof(buff)); printf("Received data (%zu bytes): '%s'\n", len, buff); } else if (FD_ISSET(logpipefd[0], &rfds)) { struct knet_log_msg msg; size_t bytes_read = 0; while (bytes_read < sizeof(struct knet_log_msg)) { len = read(logpipefd[0], &msg + bytes_read, sizeof(struct knet_log_msg) - bytes_read); if (len <= 0) { printf("Error from log fd, unable to read data\n"); exit(EXIT_FAILURE); } bytes_read += len; } printf("[%s] %s: %s\n", knet_get_loglevel_name(msg.msglevel), knet_get_subsystem_name(msg.subsystem), msg.msg); } if ((tv.tv_sec > 0) || (tv.tv_usec > 0)) goto select_loop; } /* FIXME: allocated hosts should be free'd */ return 0; }