|
@@ -189,7 +189,7 @@ NetSocketPosix::~NetSocketPosix() {
|
|
#pragma GCC diagnostic ignored "-Wlogical-op"
|
|
#pragma GCC diagnostic ignored "-Wlogical-op"
|
|
#endif
|
|
#endif
|
|
|
|
|
|
-NetSocketPosix::NetError NetSocketPosix::_get_socket_error() {
|
|
|
|
|
|
+NetSocketPosix::NetError NetSocketPosix::_get_socket_error() const {
|
|
#if defined(WINDOWS_ENABLED)
|
|
#if defined(WINDOWS_ENABLED)
|
|
int err = WSAGetLastError();
|
|
int err = WSAGetLastError();
|
|
|
|
|
|
@@ -199,7 +199,7 @@ NetSocketPosix::NetError NetSocketPosix::_get_socket_error() {
|
|
return ERR_NET_IN_PROGRESS;
|
|
return ERR_NET_IN_PROGRESS;
|
|
if (err == WSAEWOULDBLOCK)
|
|
if (err == WSAEWOULDBLOCK)
|
|
return ERR_NET_WOULD_BLOCK;
|
|
return ERR_NET_WOULD_BLOCK;
|
|
- ERR_PRINTS("Socket error: " + itos(err));
|
|
|
|
|
|
+ print_verbose("Socket error: " + itos(err));
|
|
return ERR_NET_OTHER;
|
|
return ERR_NET_OTHER;
|
|
#else
|
|
#else
|
|
if (errno == EISCONN)
|
|
if (errno == EISCONN)
|
|
@@ -208,7 +208,7 @@ NetSocketPosix::NetError NetSocketPosix::_get_socket_error() {
|
|
return ERR_NET_IN_PROGRESS;
|
|
return ERR_NET_IN_PROGRESS;
|
|
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
|
if (errno == EAGAIN || errno == EWOULDBLOCK)
|
|
return ERR_NET_WOULD_BLOCK;
|
|
return ERR_NET_WOULD_BLOCK;
|
|
- ERR_PRINTS("Socket error: " + itos(errno));
|
|
|
|
|
|
+ print_verbose("Socket error: " + itos(errno));
|
|
return ERR_NET_OTHER;
|
|
return ERR_NET_OTHER;
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
@@ -387,8 +387,10 @@ Error NetSocketPosix::bind(IP_Address p_addr, uint16_t p_port) {
|
|
size_t addr_size = _set_addr_storage(&addr, p_addr, p_port, _ip_type);
|
|
size_t addr_size = _set_addr_storage(&addr, p_addr, p_port, _ip_type);
|
|
|
|
|
|
if (::bind(_sock, (struct sockaddr *)&addr, addr_size) != 0) {
|
|
if (::bind(_sock, (struct sockaddr *)&addr, addr_size) != 0) {
|
|
|
|
+ _get_socket_error();
|
|
|
|
+ print_verbose("Failed to bind socket.");
|
|
close();
|
|
close();
|
|
- ERR_FAIL_V(ERR_UNAVAILABLE);
|
|
|
|
|
|
+ return ERR_UNAVAILABLE;
|
|
}
|
|
}
|
|
|
|
|
|
return OK;
|
|
return OK;
|
|
@@ -398,9 +400,10 @@ Error NetSocketPosix::listen(int p_max_pending) {
|
|
ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
|
|
ERR_FAIL_COND_V(!is_open(), ERR_UNCONFIGURED);
|
|
|
|
|
|
if (::listen(_sock, p_max_pending) != 0) {
|
|
if (::listen(_sock, p_max_pending) != 0) {
|
|
-
|
|
|
|
|
|
+ _get_socket_error();
|
|
|
|
+ print_verbose("Failed to listen from socket.");
|
|
close();
|
|
close();
|
|
- ERR_FAIL_V(FAILED);
|
|
|
|
|
|
+ return FAILED;
|
|
};
|
|
};
|
|
|
|
|
|
return OK;
|
|
return OK;
|
|
@@ -427,7 +430,7 @@ Error NetSocketPosix::connect_to_host(IP_Address p_host, uint16_t p_port) {
|
|
case ERR_NET_IN_PROGRESS:
|
|
case ERR_NET_IN_PROGRESS:
|
|
return ERR_BUSY;
|
|
return ERR_BUSY;
|
|
default:
|
|
default:
|
|
- ERR_PRINT("Connection to remote host failed!");
|
|
|
|
|
|
+ print_verbose("Connection to remote host failed!");
|
|
close();
|
|
close();
|
|
return FAILED;
|
|
return FAILED;
|
|
}
|
|
}
|
|
@@ -474,12 +477,18 @@ Error NetSocketPosix::poll(PollType p_type, int p_timeout) const {
|
|
}
|
|
}
|
|
int ret = select(1, rdp, wrp, &ex, tp);
|
|
int ret = select(1, rdp, wrp, &ex, tp);
|
|
|
|
|
|
- ERR_FAIL_COND_V(ret == SOCKET_ERROR, FAILED);
|
|
|
|
|
|
+ if (ret == SOCKET_ERROR) {
|
|
|
|
+ return FAILED;
|
|
|
|
+ }
|
|
|
|
|
|
if (ret == 0)
|
|
if (ret == 0)
|
|
return ERR_BUSY;
|
|
return ERR_BUSY;
|
|
|
|
|
|
- ERR_FAIL_COND_V(FD_ISSET(_sock, &ex), FAILED);
|
|
|
|
|
|
+ if (FD_ISSET(_sock, &ex)) {
|
|
|
|
+ _get_socket_error();
|
|
|
|
+ print_verbose("Exception when polling socket.");
|
|
|
|
+ return FAILED;
|
|
|
|
+ }
|
|
|
|
|
|
if (rdp && FD_ISSET(_sock, rdp))
|
|
if (rdp && FD_ISSET(_sock, rdp))
|
|
ready = true;
|
|
ready = true;
|
|
@@ -506,8 +515,11 @@ Error NetSocketPosix::poll(PollType p_type, int p_timeout) const {
|
|
|
|
|
|
int ret = ::poll(&pfd, 1, p_timeout);
|
|
int ret = ::poll(&pfd, 1, p_timeout);
|
|
|
|
|
|
- ERR_FAIL_COND_V(ret < 0, FAILED);
|
|
|
|
- ERR_FAIL_COND_V(pfd.revents & POLLERR, FAILED);
|
|
|
|
|
|
+ if (ret < 0 || pfd.revents & POLLERR) {
|
|
|
|
+ _get_socket_error();
|
|
|
|
+ print_verbose("Error when polling socket.");
|
|
|
|
+ return FAILED;
|
|
|
|
+ }
|
|
|
|
|
|
if (ret == 0)
|
|
if (ret == 0)
|
|
return ERR_BUSY;
|
|
return ERR_BUSY;
|
|
@@ -685,11 +697,15 @@ bool NetSocketPosix::is_open() const {
|
|
|
|
|
|
int NetSocketPosix::get_available_bytes() const {
|
|
int NetSocketPosix::get_available_bytes() const {
|
|
|
|
|
|
- ERR_FAIL_COND_V(_sock == SOCK_EMPTY, -1);
|
|
|
|
|
|
+ ERR_FAIL_COND_V(!is_open(), -1);
|
|
|
|
|
|
unsigned long len;
|
|
unsigned long len;
|
|
int ret = SOCK_IOCTL(_sock, FIONREAD, &len);
|
|
int ret = SOCK_IOCTL(_sock, FIONREAD, &len);
|
|
- ERR_FAIL_COND_V(ret == -1, 0);
|
|
|
|
|
|
+ if (ret == -1) {
|
|
|
|
+ _get_socket_error();
|
|
|
|
+ print_verbose("Error when checking available bytes on socket.");
|
|
|
|
+ return -1;
|
|
|
|
+ }
|
|
return len;
|
|
return len;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -701,7 +717,11 @@ Ref<NetSocket> NetSocketPosix::accept(IP_Address &r_ip, uint16_t &r_port) {
|
|
struct sockaddr_storage their_addr;
|
|
struct sockaddr_storage their_addr;
|
|
socklen_t size = sizeof(their_addr);
|
|
socklen_t size = sizeof(their_addr);
|
|
SOCKET_TYPE fd = ::accept(_sock, (struct sockaddr *)&their_addr, &size);
|
|
SOCKET_TYPE fd = ::accept(_sock, (struct sockaddr *)&their_addr, &size);
|
|
- ERR_FAIL_COND_V(fd == SOCK_EMPTY, out);
|
|
|
|
|
|
+ if (fd == SOCK_EMPTY) {
|
|
|
|
+ _get_socket_error();
|
|
|
|
+ print_verbose("Error when accepting socket connection.");
|
|
|
|
+ return out;
|
|
|
|
+ }
|
|
|
|
|
|
_set_ip_port(&their_addr, r_ip, r_port);
|
|
_set_ip_port(&their_addr, r_ip, r_port);
|
|
|
|
|