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;
}
int ret = client.read(buffer, 2U);
int ret = client.readExact(buffer, 2U);
size_t sofar = gwy_map.size();
while (ret == 2) {
unsigned int len = (buffer[1U] & 0x0FU) * 256U + buffer[0U];
printf("next len = %u\n", len);
// Ensure that we get exactly len - 2U bytes from the TCP stream
ret = client.read(buffer + 2U, len - 2U);
if (ret<=0) {
ret = client.readExact(buffer + 2U, len - 2U);
if (0 > ret) {
fprintf(stderr, "Problem reading line, it returned %d\n", errno);
return true;
}

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

Loading…
Cancel
Save

Powered by TurnKey Linux.