[Mono-devel-list] Socket Send/ReceiveTimeouts

Matthias Sessler sessler at in.tum.de
Thu Apr 3 05:17:07 EST 2003


hi
> I'm sorry, is it correct that this code closes the socket
> on send or receive timeout? If so I don't think that's
> right. I believe that on systems that do support setting of
> SO_RCVTIMEO and SO_SNDTIMEO the way to go is obviously to
> employ these options. On systems that do not support these
> I would call select or poll with appropriate timeout just
> before send/recv.
I don't know how other systems work with these settings, but from what 
i tested, the ms .net framework closes the socket, after a timeout 
appears.
A solution would be to try to set these settings and if a Exception is 
thrown, use my code. But this would result in different behaivour on 
different mono plattforms which sould at least be documented if not 
prohibited.

> Additionally, although I didn't analyze the code carefully
> enough, it looks like it might be a subject to race conditions.
I hope not. These are the scenarios that i considered:

1. Timeout apears while socket is waiting:
- timeout method closes the socket, Exception is thrown, everything is 
fine.

2. Timeout apears after the internal socket method returned.
2.1 the DisableTimeout method is first to lock the timer object
- the timeout is disabled, and a TimeoutActive is set to false (this is 
set to true in the InitTimeout methods)
- then the OnTimeout method acquires the lock and because TimeoutActive 
is false, the socket will not be closed
- the method returns correct

2.2 the OnTimeout method is first to lock the timer object
- the OnTimeout method closes the socket
- then the DisableTimeout method acquires the lock and because the 
socket is closed, the method will throw a SocketException

3. The Timeout apears after the send/receive returned
- timeout is disabled everything is fine.

If i missed something please tell me.

The only downside is 2.2 where you got the result, but have to throw it 
away. I found know way to perhibit this. At least it returns a correct 
(Exception and socket closed/value and sockte open) to the upper level.

regards
/matthias




More information about the Mono-devel-list mailing list