From cb5329b2cada0827c9b810eeedeb96cfc6011149 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Tue, 16 Jul 2024 20:58:42 -0400 Subject: [PATCH] simplify poll implementation; --- src/common/network/tcp/Socket.cpp | 64 ++++++++----------------------- src/common/network/tcp/Socket.h | 4 -- src/common/network/udp/Socket.cpp | 36 +++++------------ src/common/network/udp/Socket.h | 4 -- 4 files changed, 26 insertions(+), 82 deletions(-) diff --git a/src/common/network/tcp/Socket.cpp b/src/common/network/tcp/Socket.cpp index 1ccaa28d..06a8f60e 100644 --- a/src/common/network/tcp/Socket.cpp +++ b/src/common/network/tcp/Socket.cpp @@ -65,38 +65,22 @@ Socket::~Socket() int Socket::accept(sockaddr* address, socklen_t* addrlen) noexcept { // check that the accept() won't block - int i, n; - struct pollfd pfd[TCP_SOCKET_MAX]; - for (i = n = 0; i < TCP_SOCKET_MAX; i++) { - if (m_fd >= 0) { - pfd[n].fd = m_fd; - pfd[n].events = POLLIN; - n++; - } - } - - // no socket descriptor to receive - if (n == 0) - return 0; + struct pollfd pfd; + pfd.fd = m_fd; + pfd.events = POLLIN; + pfd.revents = 0; - // Return immediately - int ret = ::poll(pfd, n, 0); + // return immediately + int ret = ::poll(&pfd, 1, 0); if (ret < 0) { LogError(LOG_NET, "Error returned from TCP poll, err: %d", errno); return -1; } - int index; - for (i = 0; i < n; i++) { - // round robin - index = (i + m_counter) % n; - if (pfd[index].revents & POLLIN) - break; - } - if (i == n) + if ((pfd.revents & POLLIN) == 0) return -1; - return ::accept(pfd[index].fd, address, addrlen); + return ::accept(pfd.fd, address, addrlen); } /* Connects the client to a remote TCP host using the specified host name and port number. */ @@ -143,39 +127,23 @@ ssize_t Socket::listen(const std::string& ipAddr, const uint16_t port, int backl return -1; // check that the read() won't block - int i, n; - struct pollfd pfd[TCP_SOCKET_MAX]; - for (i = n = 0; i < TCP_SOCKET_MAX; i++) { - if (m_fd >= 0) { - pfd[n].fd = m_fd; - pfd[n].events = POLLIN; - n++; - } - } - - // no socket descriptor to receive - if (n == 0) - return 0; + struct pollfd pfd; + pfd.fd = m_fd; + pfd.events = POLLIN; + pfd.revents = 0; - // Return immediately - int ret = ::poll(pfd, n, 0); + // return immediately + int ret = ::poll(&pfd, 1, 0); if (ret < 0) { LogError(LOG_NET, "Error returned from TCP poll, err: %d", errno); return -1; } - int index; - for (i = 0; i < n; i++) { - // round robin - index = (i + m_counter) % n; - if (pfd[index].revents & POLLIN) - break; - } - if (i == n) + if ((pfd.revents & POLLIN) == 0) return 0; m_counter++; - return ::read(pfd[index].fd, (char*)buffer, length); + return ::read(pfd.fd, (char*)buffer, length); } /* Write data to the socket. */ diff --git a/src/common/network/tcp/Socket.h b/src/common/network/tcp/Socket.h index 75e500bd..de41cf01 100644 --- a/src/common/network/tcp/Socket.h +++ b/src/common/network/tcp/Socket.h @@ -33,10 +33,6 @@ #include #include -#if !defined(TCP_SOCKET_MAX) -#define TCP_SOCKET_MAX 1 -#endif - namespace network { namespace tcp diff --git a/src/common/network/udp/Socket.cpp b/src/common/network/udp/Socket.cpp index 1e9bf6b1..1adfe807 100644 --- a/src/common/network/udp/Socket.cpp +++ b/src/common/network/udp/Socket.cpp @@ -149,40 +149,24 @@ ssize_t Socket::read(uint8_t* buffer, uint32_t length, sockaddr_storage& address if (m_fd < 0) return -1; - // Check that the readfrom() won't block - int i, n; - struct pollfd pfd[UDP_SOCKET_MAX]; - for (i = n = 0; i < UDP_SOCKET_MAX; i++) { - if (m_fd >= 0) { - pfd[n].fd = m_fd; - pfd[n].events = POLLIN; - n++; - } - } - - // no socket descriptor to receive - if (n == 0) - return 0; - - // Return immediately - int ret = ::poll(pfd, n, 0); + // check that the readfrom() won't block + struct pollfd pfd; + pfd.fd = m_fd; + pfd.events = POLLIN; + pfd.revents = 0; + + // return immediately + int ret = ::poll(&pfd, 1, 0); if (ret < 0) { LogError(LOG_NET, "Error returned from UDP poll, err: %d", errno); return -1; } - int index; - for (i = 0; i < n; i++) { - // round robin - index = (i + m_counter) % n; - if (pfd[index].revents & POLLIN) - break; - } - if (i == n) + if ((pfd.revents & POLLIN) == 0) return 0; socklen_t size = sizeof(sockaddr_storage); - ssize_t len = ::recvfrom(pfd[index].fd, (char*)buffer, length, 0, (sockaddr*)& address, &size); + ssize_t len = ::recvfrom(pfd.fd, (char*)buffer, length, 0, (sockaddr*)& address, &size); if (len <= 0) { LogError(LOG_NET, "Error returned from recvfrom, err: %d", errno); diff --git a/src/common/network/udp/Socket.h b/src/common/network/udp/Socket.h index dbf4f6cf..933ef421 100644 --- a/src/common/network/udp/Socket.h +++ b/src/common/network/udp/Socket.h @@ -37,10 +37,6 @@ #include #include -#if !defined(UDP_SOCKET_MAX) -#define UDP_SOCKET_MAX 1 -#endif - #define AES_WRAPPED_PCKT_MAGIC 0xC0FEU #define AES_WRAPPED_PCKT_KEY_LEN 32