simplify poll implementation;

pull/63/head
Bryan Biedenkapp 2 years ago
parent dbe1f69071
commit cb5329b2ca

@ -65,38 +65,22 @@ Socket::~Socket()
int Socket::accept(sockaddr* address, socklen_t* addrlen) noexcept int Socket::accept(sockaddr* address, socklen_t* addrlen) noexcept
{ {
// check that the accept() won't block // check that the accept() won't block
int i, n; struct pollfd pfd;
struct pollfd pfd[TCP_SOCKET_MAX]; pfd.fd = m_fd;
for (i = n = 0; i < TCP_SOCKET_MAX; i++) { pfd.events = POLLIN;
if (m_fd >= 0) { pfd.revents = 0;
pfd[n].fd = m_fd;
pfd[n].events = POLLIN;
n++;
}
}
// no socket descriptor to receive
if (n == 0)
return 0;
// Return immediately // return immediately
int ret = ::poll(pfd, n, 0); int ret = ::poll(&pfd, 1, 0);
if (ret < 0) { if (ret < 0) {
LogError(LOG_NET, "Error returned from TCP poll, err: %d", errno); LogError(LOG_NET, "Error returned from TCP poll, err: %d", errno);
return -1; return -1;
} }
int index; if ((pfd.revents & POLLIN) == 0)
for (i = 0; i < n; i++) {
// round robin
index = (i + m_counter) % n;
if (pfd[index].revents & POLLIN)
break;
}
if (i == n)
return -1; 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. */ /* 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; return -1;
// check that the read() won't block // check that the read() won't block
int i, n; struct pollfd pfd;
struct pollfd pfd[TCP_SOCKET_MAX]; pfd.fd = m_fd;
for (i = n = 0; i < TCP_SOCKET_MAX; i++) { pfd.events = POLLIN;
if (m_fd >= 0) { pfd.revents = 0;
pfd[n].fd = m_fd;
pfd[n].events = POLLIN;
n++;
}
}
// no socket descriptor to receive
if (n == 0)
return 0;
// Return immediately // return immediately
int ret = ::poll(pfd, n, 0); int ret = ::poll(&pfd, 1, 0);
if (ret < 0) { if (ret < 0) {
LogError(LOG_NET, "Error returned from TCP poll, err: %d", errno); LogError(LOG_NET, "Error returned from TCP poll, err: %d", errno);
return -1; return -1;
} }
int index; if ((pfd.revents & POLLIN) == 0)
for (i = 0; i < n; i++) {
// round robin
index = (i + m_counter) % n;
if (pfd[index].revents & POLLIN)
break;
}
if (i == n)
return 0; return 0;
m_counter++; m_counter++;
return ::read(pfd[index].fd, (char*)buffer, length); return ::read(pfd.fd, (char*)buffer, length);
} }
/* Write data to the socket. */ /* Write data to the socket. */

@ -33,10 +33,6 @@
#include <cstdlib> #include <cstdlib>
#include <ctime> #include <ctime>
#if !defined(TCP_SOCKET_MAX)
#define TCP_SOCKET_MAX 1
#endif
namespace network namespace network
{ {
namespace tcp namespace tcp

@ -149,40 +149,24 @@ ssize_t Socket::read(uint8_t* buffer, uint32_t length, sockaddr_storage& address
if (m_fd < 0) if (m_fd < 0)
return -1; return -1;
// Check that the readfrom() won't block // check that the readfrom() won't block
int i, n; struct pollfd pfd;
struct pollfd pfd[UDP_SOCKET_MAX]; pfd.fd = m_fd;
for (i = n = 0; i < UDP_SOCKET_MAX; i++) { pfd.events = POLLIN;
if (m_fd >= 0) { pfd.revents = 0;
pfd[n].fd = m_fd;
pfd[n].events = POLLIN; // return immediately
n++; int ret = ::poll(&pfd, 1, 0);
}
}
// no socket descriptor to receive
if (n == 0)
return 0;
// Return immediately
int ret = ::poll(pfd, n, 0);
if (ret < 0) { if (ret < 0) {
LogError(LOG_NET, "Error returned from UDP poll, err: %d", errno); LogError(LOG_NET, "Error returned from UDP poll, err: %d", errno);
return -1; return -1;
} }
int index; if ((pfd.revents & POLLIN) == 0)
for (i = 0; i < n; i++) {
// round robin
index = (i + m_counter) % n;
if (pfd[index].revents & POLLIN)
break;
}
if (i == n)
return 0; return 0;
socklen_t size = sizeof(sockaddr_storage); 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) { if (len <= 0) {
LogError(LOG_NET, "Error returned from recvfrom, err: %d", errno); LogError(LOG_NET, "Error returned from recvfrom, err: %d", errno);

@ -37,10 +37,6 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <errno.h> #include <errno.h>
#if !defined(UDP_SOCKET_MAX)
#define UDP_SOCKET_MAX 1
#endif
#define AES_WRAPPED_PCKT_MAGIC 0xC0FEU #define AES_WRAPPED_PCKT_MAGIC 0xC0FEU
#define AES_WRAPPED_PCKT_KEY_LEN 32 #define AES_WRAPPED_PCKT_KEY_LEN 32

Loading…
Cancel
Save

Powered by TurnKey Linux.