[Mono-list] threads and Async Socket methods

Kele Turnipseed kele@cynet.net.au
Sat, 8 May 2004 02:09:16 +1000


I am not sure if the problem I am experiencing is the same as yours, but I
will explain what appears to be happening to me.

I have a similar program: a TCP server with lots of data being relayed
between the clients.  I am using async for accepting, sending and receiving.

When I have about 20 async calls which have not returned for a while, all
subsequent calls lock up until the first calls finish.  This happens a lot
when a client stops acknowledging packets, but is not registering as
disconnected.  I can see a large send queue value in netstat when this
happens.

My questions are:
- Am I completely wrong about what's happening?  I will try writing a test
program, but the conditions will be hard to emulate.
- If I am right, is there any way to avoid this?  Can I check the send queue
value inside a mono app?  I was thinking of keeping a counter of the current
outstanding queues.
- Can you suggest any diagnostic classes I could try to help me find out
what is really happening? eg finding out what state other threads are in.

Soon I will try Beta 1 to see if this still occurs.

Btw, I have developed this solely using mono and MonoDevelop.  I really
appreciate the work you guys do.


Kele

-----Original Message-----
From: mono-list-admin@lists.ximian.com
[mailto:mono-list-admin@lists.ximian.com]On Behalf Of P Oscar Boykin
Sent: Wednesday, 28 April 2004 10:33 AM
To: mono-list@lists.ximian.com
Subject: [Mono-list] threads and Async Socket methods


Hello All,

I have some code that does asynchronous Socket.BeginSend and
Socket.BeginReceive calls.

My question is the following:

1) The documentation (in monodoc) says that no instance members of
Socket are guaranteed to be thread safe.

2) Given the above, is it safe to have a BeginSend call active while a
BeginReceive call is also active?  Given that the "under the hood" it
appears that these methods are implemented with threads.

So, to make it clear, if I have code like:

--------------
BeginSend()
BeginReceive()

[ other stuff here ]

EndReceive()
EndSend()
-------------

is this safe?  To me, it would seem like it would not be safe if none of
the members are guaranteed to be thread safe, but on the other hand, I
have a C# networking book that has examples such as this.

The reason I ask is that I have some code that (on mono 0.31) appears
that *SOMETIMES* the BeginSend never calls the callback function to
indicate that it finished (and the other side never gets the data).
This is happening while a BeginReceive() is active.

When I see bugs that happen only sometimes, it usually makes me worry
about thread safety.  It would be nice if the Begin* methods were
designed such that there could be more than one of them active at a time
(particularly, it would be nice to have a send going on while a receive
was also active).

Am I expecting too much here?

Thanks,
Oscar
--
boykin@pobox.com    http://pobox.com/~boykin    jabber: johnynek@jabber.org
fingerprint=D250 4AD9 4544 B7D2 A17C  911D D608 D387 6718 D75F
Hague Convention is Bad News: http://www.gnu.org/philosophy/hague.html