Merge pull request #2756 from trond/bugfix_udp

UDP fixes
This commit is contained in:
Juan Linietsky 2015-11-19 19:33:04 -03:00
commit 6127f17368
2 changed files with 22 additions and 3 deletions

View File

@ -121,7 +121,7 @@ Error PacketPeerUDPPosix::_poll(bool p_wait) {
struct sockaddr_in from = {0};
socklen_t len = sizeof(struct sockaddr_in);
int ret;
while ( (ret = recvfrom(sockfd, recv_buffer, MIN(sizeof(recv_buffer),rb.data_left()-12), p_wait?0:MSG_DONTWAIT, (struct sockaddr*)&from, &len)) > 0) {
while ( (ret = recvfrom(sockfd, recv_buffer, MIN((int)sizeof(recv_buffer),MAX(rb.space_left()-12, 0)), 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 +131,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;

View File

@ -121,7 +121,7 @@ Error PacketPeerUDPWinsock::_poll(bool p_wait) {
struct sockaddr_in from = {0};
int len = sizeof(struct sockaddr_in);
int ret;
while ( (ret = recvfrom(sockfd, (char*)recv_buffer, MIN(sizeof(recv_buffer),rb.data_left()-12), 0, (struct sockaddr*)&from, &len)) > 0) {
while ( (ret = recvfrom(sockfd, (char*)recv_buffer, MIN((int)sizeof(recv_buffer),MAX(rb.space_left()-12, 0)), 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 +132,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;
};