[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Help-gnutls] gnutls and non blocking socket
From: |
Martin Lambers |
Subject: |
Re: [Help-gnutls] gnutls and non blocking socket |
Date: |
Sat, 16 Jul 2005 14:53:55 +0200 |
User-agent: |
Mutt/1.5.6+20040907i |
On Wed, 13. Jul 2005, 18:17:58 +0200, Nikos Mavrogiannopoulos wrote:
> >Ok, I give some explanation of my problem :
> >Under windows (as it is not implemented under Linux) I've created a
> >socket with a RECV timeout.
> >I do a gnutls_record_recv on a TLS session built over the socket.
> >When the timeout expires, I try to send a packet with gnutls_record_send
> >on that TLS session. The point is that at this moment gnutls_record_send
> >always fail sending a -10 error (TLS session not correct).
>
> >I may have look in the bad place in the code but it seems that there's a
> >problem anyway.
>
> I don't think there is. Most probably you are using SO_RCVTIMEO to
> setsockopt, so you get something different as errno than EAGAIN or
> EINTR. This is like a BSD extension and I don't know if this can be
> handled by gnutls in a portable way. As a quick hack you could make
> a wrapper over recv() and return EINTR or EAGAIN when you get the
> timeout errno code.
As far as I know, EAGAIN is the errno return code of recv() when a
SO_RCVTIMEO timeout expires (and similar for SO_SNDTIMEO and send()),
and gnutls_record_recv() and gnutls_record_send() pass this through by
returning GNUTLS_E_AGAIN.
According to the Windows setsockopt() documentation at
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/
winsock/winsock/setsockopt_2.asp
there are two problems with using SO_*TIMEO on Windows:
1. They don't work correctly on systems older than Windows 2000.
2. The socket is unusable once a timeout occurs. (Which means they don't
work correctly even on Windows 2000 and newer).
This is probably the cause of the "TLS session not correct" error.
Martin