diff --git a/include/frnetlib/Socket.h b/include/frnetlib/Socket.h index 85a4d41..e213b8e 100644 --- a/include/frnetlib/Socket.h +++ b/include/frnetlib/Socket.h @@ -39,6 +39,7 @@ namespace fr ReceiveError = 17, AcceptError = 18, SSLError = 19, + NoRouteToHost = 20 //Remember to update status_to_string if more are added }; diff --git a/src/SSLSocket.cpp b/src/SSLSocket.cpp index e9c8694..b49fda1 100644 --- a/src/SSLSocket.cpp +++ b/src/SSLSocket.cpp @@ -70,7 +70,11 @@ namespace fr if(receive_timeout == 0) { status = mbedtls_ssl_read(ssl.get(), (unsigned char *)data, data_size); - if(status <= 0) + if(status == 0) + { + return Socket::Status::Disconnected; + } + if(status < 0) { if(status == MBEDTLS_ERR_SSL_WANT_READ || status == MBEDTLS_ERR_SSL_WANT_WRITE) { diff --git a/src/Socket.cpp b/src/Socket.cpp index 1b47071..51b0ff2 100644 --- a/src/Socket.cpp +++ b/src/Socket.cpp @@ -156,6 +156,9 @@ namespace fr return "Generic SSL Error"; #endif } + case NoRouteToHost: + return "No Route To Host"; + break; default: return "Unknown"; } diff --git a/src/TcpSocket.cpp b/src/TcpSocket.cpp index 7a04f6a..868a534 100644 --- a/src/TcpSocket.cpp +++ b/src/TcpSocket.cpp @@ -52,11 +52,17 @@ namespace fr Socket::Status TcpSocket::receive_raw(void *data, size_t buffer_size, size_t &received) { + received = 0; ssize_t status = 0; do { status = ::recv(socket_descriptor, (char*)data, buffer_size, 0); - if(status <= 0) + if(status == 0) + { + return Socket::Status::Disconnected; + } + + if(status < 0) { if(errno == EWOULDBLOCK || errno == EAGAIN) { @@ -163,7 +169,7 @@ namespace fr //We're done with this now, cleanup freeaddrinfo(info); if(c == nullptr) - return Socket::Status::Error; + return Socket::Status::NoRouteToHost; //Turn back to blocking mode if(!set_unix_socket_blocking(socket_descriptor, false, true))