Added NoRouteToHost error. Fixed Disconnect not being returned by Socket

This commit is contained in:
Fred Nicolson 2019-01-15 11:09:11 +00:00
parent d53cc86fb9
commit 992fbc885e
4 changed files with 17 additions and 3 deletions

View File

@ -39,6 +39,7 @@ namespace fr
ReceiveError = 17, ReceiveError = 17,
AcceptError = 18, AcceptError = 18,
SSLError = 19, SSLError = 19,
NoRouteToHost = 20
//Remember to update status_to_string if more are added //Remember to update status_to_string if more are added
}; };

View File

@ -70,7 +70,11 @@ namespace fr
if(receive_timeout == 0) if(receive_timeout == 0)
{ {
status = mbedtls_ssl_read(ssl.get(), (unsigned char *)data, data_size); 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) if(status == MBEDTLS_ERR_SSL_WANT_READ || status == MBEDTLS_ERR_SSL_WANT_WRITE)
{ {

View File

@ -156,6 +156,9 @@ namespace fr
return "Generic SSL Error"; return "Generic SSL Error";
#endif #endif
} }
case NoRouteToHost:
return "No Route To Host";
break;
default: default:
return "Unknown"; return "Unknown";
} }

View File

@ -52,11 +52,17 @@ namespace fr
Socket::Status TcpSocket::receive_raw(void *data, size_t buffer_size, size_t &received) Socket::Status TcpSocket::receive_raw(void *data, size_t buffer_size, size_t &received)
{ {
received = 0;
ssize_t status = 0; ssize_t status = 0;
do do
{ {
status = ::recv(socket_descriptor, (char*)data, buffer_size, 0); 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) if(errno == EWOULDBLOCK || errno == EAGAIN)
{ {
@ -163,7 +169,7 @@ namespace fr
//We're done with this now, cleanup //We're done with this now, cleanup
freeaddrinfo(info); freeaddrinfo(info);
if(c == nullptr) if(c == nullptr)
return Socket::Status::Error; return Socket::Status::NoRouteToHost;
//Turn back to blocking mode //Turn back to blocking mode
if(!set_unix_socket_blocking(socket_descriptor, false, true)) if(!set_unix_socket_blocking(socket_descriptor, false, true))