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.

This commit is contained in:
amcewen 2011-01-02 22:21:24 +00:00
parent bc0f3c4fe1
commit 81b6c69f29
3 changed files with 24 additions and 8 deletions

View File

@ -77,14 +77,25 @@ int Client::available() {
int Client::read() { int Client::read() {
uint8_t b; uint8_t b;
if (!available()) if ( recv(_sock, &b, 1) )
{
// recv worked
return b;
}
else
{
// No data available
return -1; 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() { int Client::peek() {
uint8_t b; uint8_t b;
// Unlike recv, peek doesn't check to see if there's any data available, so we must
if (!available()) if (!available())
return -1; return -1;
::peek(_sock, &b); ::peek(_sock, &b);

View File

@ -17,6 +17,7 @@ public:
virtual void write(const uint8_t *buf, size_t size); virtual void write(const uint8_t *buf, size_t size);
virtual int available(); virtual int available();
virtual int read(); virtual int read();
virtual int read(uint8_t *buf, size_t size);
virtual int peek(); virtual int peek();
virtual void flush(); virtual void flush();
void stop(); void stop();

View File

@ -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 recv(SOCKET s, uint8_t *buf, uint16_t len)
{ {
uint16_t ret=0; // Check how much data is available
uint16_t ret = W5100.getRXReceivedSize(s);
if ( len > 0 ) if (ret > len)
{ {
W5100.recv_data_processing(s, buf, len);
W5100.execCmdSn(s, Sock_RECV);
ret = len; ret = len;
} }
if ( ret > 0 )
{
W5100.recv_data_processing(s, buf, ret);
W5100.execCmdSn(s, Sock_RECV);
}
return ret; return ret;
} }