diff --git a/test/selftest.cpp b/test/selftest.cpp index 68563b2..5c2afb6 100644 --- a/test/selftest.cpp +++ b/test/selftest.cpp @@ -125,6 +125,7 @@ #define GETSOCKOPT zts_getsockopt #define IOCTL zts_ioctl #define FCNTL zts_fcntl +#define SELECT zts_select #define CLOSE zts_close #define GETPEERNAME zts_getpeername #endif @@ -161,6 +162,7 @@ inline unsigned int gettid() #define GETSOCKOPT getsockopt #define IOCTL ioctl #define FCNTL fcntl +#define SELECT select #define CLOSE close #define GETPEERNAME getpeername #endif @@ -331,6 +333,182 @@ void RECORD_RESULTS(bool passed, char *details, std::vector *result +/****************************************************************************/ +/* POLL/SELECT */ +/****************************************************************************/ + +void tcp_select_server(TCP_UNIT_TEST_SIG_4) +{ + std::string testname = "tcp_select_server"; + std::string msg = "tcp_select"; + fprintf(stderr, "\n\n%s (ts=%lu)\n", testname.c_str(), get_now_ts); + fprintf(stderr, "accept connection, create poll/select loop, read and write strings back and forth\n"); + int w=0, r=0, fd, client_fd, err, len = strlen(msg.c_str()); + char rbuf[STR_SIZE]; + memset(rbuf, 0, sizeof rbuf); + if ((fd = SOCKET(AF_INET, SOCK_STREAM, 0)) < 0) { + DEBUG_ERROR("error creating ZeroTier socket"); + perror("socket"); + *passed = false; + return; + } + if ((err = BIND(fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in)) < 0)) { + DEBUG_ERROR("error binding to interface (%d)", err); + perror("bind"); + *passed = false; + return; + } + if ((err = LISTEN(fd, 100)) < 0) { + printf("error placing socket in LISTENING state (%d)", err); + perror("listen"); + *passed = false; + return; + } + struct sockaddr_in client; + socklen_t client_addrlen = sizeof(sockaddr_in); + if ((client_fd = ACCEPT(fd, (struct sockaddr *)&client, &client_addrlen)) < 0) { + perror("accept"); + *passed = false; + return; + } + + DEBUG_TEST("accepted connection fd=%d", client_fd); + + fd_set read_set, write_set; + + uint32_t msecs = 5; + struct timeval tv; + tv.tv_sec = msecs / 1000; + tv.tv_usec = (msecs % 1000) * 1000; + int ret = 0; + + FD_SET(client_fd, &read_set); + FD_SET(client_fd, &write_set); + + int tot = 1000, rx_num = 0, tx_num = 0; + + while(rx_num < tot && tx_num < tot) { + + FD_ZERO(&read_set); + FD_ZERO(&write_set); + + FD_SET(client_fd, &read_set); + FD_SET(client_fd, &write_set); + + ret = SELECT(client_fd + 1, &read_set, &write_set, NULL, &tv); + + if (ret > 0) { + for (int fd_i=0; fd_i 0) { + DEBUG_TEST("socket activity"); + for (int fd_i=0; fd_i