diff --git a/libraries/Ethernet/Client.cpp b/libraries/Ethernet/Client.cpp index 51cb5eb14..96d5c7eed 100644 --- a/libraries/Ethernet/Client.cpp +++ b/libraries/Ethernet/Client.cpp @@ -77,7 +77,7 @@ int Client::available() { int Client::read() { uint8_t b; - if ( recv(_sock, &b, 1) ) + if ( recv(_sock, &b, 1) > 0 ) { // recv worked return b; diff --git a/libraries/Ethernet/utility/socket.cpp b/libraries/Ethernet/utility/socket.cpp index 57cdf0d4c..cad54a5e3 100644 --- a/libraries/Ethernet/utility/socket.cpp +++ b/libraries/Ethernet/utility/socket.cpp @@ -148,7 +148,22 @@ uint16_t recv(SOCKET s, uint8_t *buf, uint16_t len) { // Check how much data is available uint16_t ret = W5100.getRXReceivedSize(s); - if (ret > len) + if ( ret == 0 ) + { + // No data available. + uint8_t status = W5100.readSnSR(s); + if ( s == SnSR::LISTEN || s == SnSR::CLOSED || s == SnSR::CLOSE_WAIT ) + { + // The remote end has closed its side of the connection, so this is the eof state + ret = 0; + } + else + { + // The connection is still up, but there's no data waiting to be read + ret = -1; + } + } + else if (ret > len) { ret = len; }