diff options
Diffstat (limited to 'client.c')
-rw-r--r-- | client.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/client.c b/client.c new file mode 100644 index 0000000..0f8bde1 --- /dev/null +++ b/client.c @@ -0,0 +1,58 @@ +#define _GNU_SOURCE // getline +#include <stdio.h> +#include <stddef.h> +#include <string.h> +#include <sys/select.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <netinet/ip_icmp.h> +#include <arpa/inet.h> +#include <unistd.h> +#include <errno.h> +#include <assert.h> +#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(msg.data, msg.length); + } + } +} |