From 81b6c69f295fc58f928f758916540d1daf5d4bc9 Mon Sep 17 00:00:00 2001 From: amcewen Date: Sun, 2 Jan 2011 22:21:24 +0000 Subject: [PATCH] An improved patch for the Client part of issue 416 (adding a multi-byte read). This one moves all of the checking into recv, so that single-byte reads also benefit. It also returns -1 if there's no data available unless we've reached EOF, in which case it returns 0. --- libraries/Ethernet/Client.cpp | 17 ++++++++++++++--- libraries/Ethernet/Client.h | 1 + libraries/Ethernet/utility/socket.cpp | 14 +++++++++----- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/libraries/Ethernet/Client.cpp b/libraries/Ethernet/Client.cpp index 3b1084f0d..51cb5eb14 100644 --- a/libraries/Ethernet/Client.cpp +++ b/libraries/Ethernet/Client.cpp @@ -77,14 +77,25 @@ int Client::available() { int Client::read() { uint8_t b; - if (!available()) + if ( recv(_sock, &b, 1) ) + { + // recv worked + return b; + } + else + { + // No data available return -1; - recv(_sock, &b, 1); - return b; + } +} + +int Client::read(uint8_t *buf, size_t size) { + return recv(_sock, buf, size); } int Client::peek() { uint8_t b; + // Unlike recv, peek doesn't check to see if there's any data available, so we must if (!available()) return -1; ::peek(_sock, &b); diff --git a/libraries/Ethernet/Client.h b/libraries/Ethernet/Client.h index f0080bdf6..8725f158a 100644 --- a/libraries/Ethernet/Client.h +++ b/libraries/Ethernet/Client.h @@ -17,6 +17,7 @@ public: virtual void write(const uint8_t *buf, size_t size); virtual int available(); virtual int read(); + virtual int read(uint8_t *buf, size_t size); virtual int peek(); virtual void flush(); void stop(); diff --git a/libraries/Ethernet/utility/socket.cpp b/libraries/Ethernet/utility/socket.cpp index 628bca808..57cdf0d4c 100644 --- a/libraries/Ethernet/utility/socket.cpp +++ b/libraries/Ethernet/utility/socket.cpp @@ -146,14 +146,18 @@ uint16_t send(SOCKET s, const uint8_t * buf, uint16_t len) */ uint16_t recv(SOCKET s, uint8_t *buf, uint16_t len) { - uint16_t ret=0; - - if ( len > 0 ) + // Check how much data is available + uint16_t ret = W5100.getRXReceivedSize(s); + if (ret > len) { - W5100.recv_data_processing(s, buf, len); - W5100.execCmdSn(s, Sock_RECV); ret = len; } + + if ( ret > 0 ) + { + W5100.recv_data_processing(s, buf, ret); + W5100.execCmdSn(s, Sock_RECV); + } return ret; }