[gnutls-help] Corrupted data when reading from gnutls input buffer
mw at atomicode.de
mw at atomicode.de
Thu Apr 18 19:49:57 CEST 2013
Hello,
I am developing a software using gnutls 3.1.0 and got a little problem,
which I hope somebody can help me get rid of.
On client side I am using a non-blocking socket and to check it for
read readiness
I call "gnutls_record_check_pending" to see if there is data in the
input buffer
remaining from the last read process. If not I call "select" on the
socket to
see if data is available to be read by "gnutls_record_recv".
Every time when data is read from the internal input buffer of gnutls
I get corrupted data.
It seems to be sporadically that data is read into the input buffer of
gnutls,
and varies in size.
Here some code:
bool Client::readable(uint32_t ms)
{
// check for data to be read from the gnutls input buffer
uint32_t r = gnutls_record_check_pending(m_session);
if (r > 0) {
return true;
}
// check for socket read readiness
fd_set fds;
FD_ZERO(&fds);
FD_SET(m_socket, &fds);
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = ms * 1000;
int res = select(m_socket+1, &fds, NULL, NULL, &tv);
if (res <= 0) {
return false;
}
return true;
}
uint32_t Client::recv(uint8_t* data, uint32_t size)
{
uint32_t s = 0;
while (s < size) {
// wait for read readiness
if (!readable(200)) {
continue;
}
// read data
int32_t ret = gnutls_record_recv(m_session, &data[s], size -
s);
if (gnutls_error_is_fatal(ret) != 0 || ret == 0) {
if (ret == 0) {
return 0;
}
else {
std::cerr << "Error: " << gnutls_strerror(ret) << "\n";
return ret;
}
}
if (ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN) {
continue;
}
s += ret;
}
return s;
}
Hope somebody can give me a hint what I may be doing wrong.
Thanks in advance.
Marc
More information about the Gnutls-help
mailing list