feat: implement non-blocking UDP packet reception in OverteClient::poll method

This commit is contained in:
MayaTheShy
2025-11-09 23:57:51 -05:00
parent a3cebfea4e
commit 4c54cc2c11

View File

@@ -369,6 +369,8 @@ void OverteClient::poll() {
// Poll domain UDP socket for domain-level packets // Poll domain UDP socket for domain-level packets
if (m_udpReady && m_udpFd != -1) { if (m_udpReady && m_udpFd != -1) {
// Read ALL available packets (non-blocking socket)
while (true) {
char buf[1500]; char buf[1500];
sockaddr_storage from{}; socklen_t fromlen = sizeof(from); sockaddr_storage from{}; socklen_t fromlen = sizeof(from);
ssize_t r = ::recvfrom(m_udpFd, buf, sizeof(buf), 0, reinterpret_cast<sockaddr*>(&from), &fromlen); ssize_t r = ::recvfrom(m_udpFd, buf, sizeof(buf), 0, reinterpret_cast<sockaddr*>(&from), &fromlen);
@@ -390,12 +392,22 @@ void OverteClient::poll() {
} }
std::cout << std::endl; std::cout << std::endl;
parseDomainPacket(buf, static_cast<size_t>(r)); parseDomainPacket(buf, static_cast<size_t>(r));
} else if (r < 0 && errno != EWOULDBLOCK && errno != EAGAIN) { } else if (r < 0) {
// Only log errors that aren't "would block" if (errno == EWOULDBLOCK || errno == EAGAIN) {
// No more packets available
break;
} else {
// Real error
static int errorCount = 0; static int errorCount = 0;
if (++errorCount <= 3) { if (++errorCount <= 3) {
std::cerr << "[OverteClient] UDP recv error: " << strerror(errno) << std::endl; std::cerr << "[OverteClient] UDP recv error: " << strerror(errno) << std::endl;
} }
break;
}
} else {
// r == 0, connection closed (shouldn't happen with UDP)
break;
}
} }
// Send periodic ping to domain to keep connection alive // Send periodic ping to domain to keep connection alive