mirror of
https://github.com/godotengine/godot.git
synced 2024-11-23 12:43:43 +00:00
* Winsock UDP messages sent to an unavailable target causing WSAECONNRESET will no longer close the socket.
* Ensured that unsigned<->signed conversion would not cause wrong buffer size values sent to recvfrom.
This commit is contained in:
parent
f809cd44ea
commit
41a161647d
@ -120,8 +120,10 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) {
|
||||
|
||||
struct sockaddr_in from = {0};
|
||||
socklen_t len = sizeof(struct sockaddr_in);
|
||||
int rb_size = MAX(rb.space_left()-12, 0);
|
||||
int buffer_size = MIN((int)sizeof(recv_buffer),rb_size);
|
||||
int ret;
|
||||
while ( (ret = recvfrom(sockfd, recv_buffer, MIN(sizeof(recv_buffer),rb.space_left()-12), p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) {
|
||||
while ( (ret = recvfrom(sockfd, recv_buffer, buffer_size, p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) {
|
||||
rb.write((uint8_t*)&from.sin_addr, 4);
|
||||
uint32_t port = ntohs(from.sin_port);
|
||||
rb.write((uint8_t*)&port, 4);
|
||||
@ -131,6 +133,8 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) {
|
||||
++queue_count;
|
||||
};
|
||||
|
||||
|
||||
// TODO: Should ECONNRESET be handled here?
|
||||
if (ret == 0 || (ret == -1 && errno != EAGAIN) ) {
|
||||
close();
|
||||
return FAILED;
|
||||
|
@ -120,8 +120,10 @@ Error PacketPeerUDPWinsock::_poll(bool p_wait) {
|
||||
|
||||
struct sockaddr_in from = {0};
|
||||
int len = sizeof(struct sockaddr_in);
|
||||
int rb_size = MAX(rb.space_left()-12, 0);
|
||||
int buffer_size = MIN((int)sizeof(recv_buffer),rb_size);
|
||||
int ret;
|
||||
while ( (ret = recvfrom(sockfd, (char*)recv_buffer, MIN(sizeof(recv_buffer),rb.space_left()-12), 0, (struct sockaddr*)&from, &len)) > 0) {
|
||||
while ( (ret = recvfrom(sockfd, (char*)recv_buffer, buffer_size, 0, (struct sockaddr*)&from, &len)) > 0) {
|
||||
rb.write((uint8_t*)&from.sin_addr, 4);
|
||||
uint32_t port = ntohs(from.sin_port);
|
||||
rb.write((uint8_t*)&port, 4);
|
||||
@ -132,8 +134,25 @@ Error PacketPeerUDPWinsock::_poll(bool p_wait) {
|
||||
++queue_count;
|
||||
};
|
||||
|
||||
if (ret == SOCKET_ERROR){
|
||||
int error = WSAGetLastError();
|
||||
|
||||
if (ret == 0 || (ret == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) ) {
|
||||
if (error == WSAEWOULDBLOCK){
|
||||
// Expected when doing non-blocking sockets, retry later.
|
||||
}
|
||||
else if (error == WSAECONNRESET){
|
||||
// If the remote target does not accept messages, this error may occur, but is harmless.
|
||||
// Once the remote target gets available, this message will disappear for new messages.
|
||||
}
|
||||
else
|
||||
{
|
||||
close();
|
||||
return FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (ret == 0) {
|
||||
close();
|
||||
return FAILED;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user