#define _GNU_SOURCE // getline #include #include #include #include #include #include #include #include #include #include #include #include "icmpd.h" #include "util.h" int main(void) { const char *remote_addr = "127.0.0.1"; // const char *remote_addr = "198.211.118.67"; struct icmpd *d = icmpd_create_client(inet_addr(remote_addr)); int d_fd = icmpd_get_select_fd(d); while (true) { fd_set inset; FD_ZERO(&inset); FD_SET(0, &inset); FD_SET(d_fd, &inset); int ret = select(d_fd + 1, &inset, NULL, NULL, NULL); if (ret < 0) { if (errno == EINTR) continue; perror("select"); return 1; } if (ret == 0) continue; // timeout if (FD_ISSET(0, &inset)) { char *line = NULL; size_t linelen = 0; errno = 0; ssize_t nr = getline(&line, &linelen, stdin); if (nr < 0) { if (errno == 0) break; // EOF perror("getline"); exit(1); } if (nr > 0) nr--; icmpd_send(d, line, nr); free(line); } if (FD_ISSET(d_fd, &inset) && icmpd_peek(d)) { struct icmpd_received msg = icmpd_recv(d); printf("Recv: %zu\n", msg.length); xxd(stdout, msg.data, msg.length); } } }