introducing exact read

pull/14/head
Tom Early 7 years ago
parent d6288f61a9
commit 82448a77bd

@ -76,15 +76,15 @@ bool CDPlusAuthenticator::authenticate(const std::string &callsign, std::map<std
return true; return true;
} }
int ret = client.read(buffer, 2U); int ret = client.readExact(buffer, 2U);
size_t sofar = gwy_map.size(); size_t sofar = gwy_map.size();
while (ret == 2) { while (ret == 2) {
unsigned int len = (buffer[1U] & 0x0FU) * 256U + buffer[0U]; unsigned int len = (buffer[1U] & 0x0FU) * 256U + buffer[0U];
printf("next len = %u\n", len); printf("next len = %u\n", len);
// Ensure that we get exactly len - 2U bytes from the TCP stream // Ensure that we get exactly len - 2U bytes from the TCP stream
ret = client.read(buffer + 2U, len - 2U); ret = client.readExact(buffer + 2U, len - 2U);
if (ret<=0) { if (0 > ret) {
fprintf(stderr, "Problem reading line, it returned %d\n", errno); fprintf(stderr, "Problem reading line, it returned %d\n", errno);
return true; return true;
} }

@ -113,6 +113,21 @@ bool CTCPReaderWriterClient::open()
return false; return false;
} }
int readExact(unsigned char *buf, unsigned int length)
{
unsigned int offset = 0U;
do {
int n = socket.read(buffer + offset, len - offset, 10U);
if (n < 0)
return n;
offset += n;
} while ((len - offset) > 0U);
return true;
}
int CTCPReaderWriterClient::read(unsigned char* buffer, unsigned int length) int CTCPReaderWriterClient::read(unsigned char* buffer, unsigned int length)
{ {
assert(buffer != NULL); assert(buffer != NULL);
@ -120,23 +135,23 @@ int CTCPReaderWriterClient::read(unsigned char* buffer, unsigned int length)
assert(m_fd != -1); assert(m_fd != -1);
// Check that the recv() won't block // Check that the recv() won't block
fd_set readFds; //fd_set readFds;
FD_ZERO(&readFds); //FD_ZERO(&readFds);
FD_SET(m_fd, &readFds); //FD_SET(m_fd, &readFds);
// Return after timeout // Return after timeout
//timeval tv; //timeval tv;
//tv.tv_sec = secs; //tv.tv_sec = secs;
//tv.tv_usec = msecs * 1000; //tv.tv_usec = msecs * 1000;
int ret = select(m_fd + 1, &readFds, NULL, NULL, NULL); // wait until it's ready //int ret = select(m_fd + 1, &readFds, NULL, NULL, NULL); // wait until it's ready
if (ret < 0) { //if (ret < 0) {
fprintf(stderr, "Error returned from TCP client select, err=%d\n", errno); // fprintf(stderr, "Error returned from TCP client select, err=%d\n", errno);
return -1; // return -1;
} //}
ssize_t len = recv(m_fd, buffer, length, 0); ssize_t len = recv(m_fd, buffer, length, 0);
if (-1 == len) { if (0 > len) {
fprintf(stderr, "Error returned from recv, err=%d\n", errno); fprintf(stderr, "Error returned from recv, err=%d\n", errno);
return -1; return -1;
} }
@ -171,7 +186,7 @@ bool CTCPReaderWriterClient::write(const unsigned char* buffer, unsigned int len
assert(length > 0U); assert(length > 0U);
assert(m_fd != -1); assert(m_fd != -1);
ssize_t ret = ::send(m_fd, (char *)buffer, length, 0); ssize_t ret = send(m_fd, (char *)buffer, length, 0);
if (ret != ssize_t(length)) { if (ret != ssize_t(length)) {
if (ret < 0) if (ret < 0)
fprintf(stderr, "Error returned from send, err=%d\n", errno); fprintf(stderr, "Error returned from send, err=%d\n", errno);

@ -42,6 +42,7 @@ public:
bool open(const std::string &address, int family, const std::string &port); bool open(const std::string &address, int family, const std::string &port);
bool open(); bool open();
int readExact(unsigned buf *char, unsigned int length);
int read(unsigned char *buffer, unsigned int length); int read(unsigned char *buffer, unsigned int length);
int readLine(std::string &line); int readLine(std::string &line);
bool write(const unsigned char* buffer, unsigned int length); bool write(const unsigned char* buffer, unsigned int length);

Loading…
Cancel
Save

Powered by TurnKey Linux.