[Mono-list] Threads & Asynchronous Sockets

Giuseppe Greco giuseppe.greco@agamura.com
Wed, 15 Oct 2003 09:43:32 +0200 (CEST)


Hi all,

Look at the following class:


public MyClass
{
  private Socket socket;
  private Thread listener;
  ...

  public MyClass(...)
  {
    socket = new Socket(...);
    ...

    listener = new Thread(new ThreadStart(Listen));
    listener.IsBackground = true;
    listener.Start();
  }

  private void Listen()
  {
    int recv = 0;
    byte[] data = null;
    EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);

    while (true) {
      if (socket.Poll(PollTimeOut, SelectMode.SelectRead)) {
        data = new byte[socket.Available];
        recv = socket.ReceiveFrom(
          data,
          0,
          data.Length,
          SocketFlags.None,
          ref remoteEndPoint);

        if (recv > 0) {
          DoSomething();
        }
      }
    }
  }

  public void Send(byte[] data, IPEndPoint remoteEndPoint)
  {
    socket.BeginSendTo(
      data,
      0,
      data.Length,
      SocketFlags.None,
      remoteEndPoint,
      new AsyncCallback(AsyncSend),
      null);
  }

  private void AsyncSend(IAsyncResult asyncResult)
  {
    socket.EndSendTo(asyncResult);
  }
}

As you can see, there is a thread that listens for
incoming datagrams, and an asynchronous Send method.
Now the question is: since the two threads work
on the same socket, could they interfere each other?

I guess they should work fine since sends and receives
use different socket buffers...

Any comment is appreciated!

Thanks,
Gius_.

----------------------------------------
Giuseppe Greco

::agamura::

phone:  +41 (0)91 604 67 65
mobile: +41 (0)76 390 60 32
email:  giuseppe.greco@agamura.com
web:    www.agamura.com
----------------------------------------