#define _GNU_SOURCE // usleep, getline #include #include #include #include #include #include #include #include #include "icmpd.h" #include "util.h" int main(void) { struct icmpd *server = icmpd_create_server(-1, 0); struct icmpd *conn = NULL; int server_fd = icmpd_get_select_fd(server); int conn_fd = -1; while (true) { fd_set inset; FD_ZERO(&inset); FD_SET(0, &inset); FD_SET(server_fd, &inset); if (conn) FD_SET(conn_fd, &inset); int nfds = maxi(0, maxi(server_fd, conn_fd)) + 1; int ret = select(nfds, &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(conn, line, nr); free(line); } if (FD_ISSET(server_fd, &inset) && icmpd_peek(server)) { struct icmpd_received msg = icmpd_recv(server); printf("Server recv: %zu\n", msg.length); xxd(stdout, msg.data, msg.length); if (conn) { printf("Message received while already connected\n"); struct icmpd *d = icmpd_create_server(msg.id, msg.source_addr); icmpd_server_set_outstanding(d, msg.seqnum); icmpd_send(d, msg.data, msg.length); icmpd_destroy(d); } else { conn = icmpd_create_server(msg.id, msg.source_addr); icmpd_server_set_outstanding(conn, msg.seqnum); conn_fd = icmpd_get_select_fd(conn); // icmpd_send(conn, "dankje", 6); // icmpd_destroy(conn); } free(msg.data); } if (conn && FD_ISSET(conn_fd, &inset) && icmpd_peek(conn)) { struct icmpd_received msg = icmpd_recv(conn); printf("Connection recv: %zu\n", msg.length); xxd(stdout, msg.data, msg.length); free(msg.data); } } }