feat: implement non-blocking UDP packet reception in OverteClient::poll method
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user