2 using System.Collections;
3 using System.Threading;
5 using System.Net.Sockets;
8 namespace MonoTests.System.Net.Sockets
11 [Category ("RequiresBSDSockets")]
12 public class SocketAsyncTest
16 ManualResetEvent readyEvent;
17 ManualResetEvent mainEvent;
23 readyEvent = new ManualResetEvent (false);
24 mainEvent = new ManualResetEvent (false);
26 ThreadPool.QueueUserWorkItem (_ => DoWork ());
27 readyEvent.WaitOne ();
29 clientSocket = new Socket (
30 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
31 clientSocket.Connect (serverSocket.LocalEndPoint);
32 clientSocket.NoDelay = true;
36 public void TearDown ()
38 if (serverSocket != null)
39 serverSocket.Close ();
46 serverSocket = new Socket (
47 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
48 serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
49 serverSocket.Listen (1);
51 var async = new SocketAsyncEventArgs ();
52 async.Completed += (s,e) => OnAccepted (e);
56 if (!serverSocket.AcceptAsync (async))
60 void OnAccepted (SocketAsyncEventArgs e)
62 var acceptSocket = e.AcceptSocket;
65 var header = new byte [4];
66 acceptSocket.Receive (header);
67 if ((header [0] != 0x12) || (header [1] != 0x34) ||
68 (header [2] != 0x56) || (header [3] != 0x78))
69 throw new InvalidOperationException ();
70 } catch (Exception ex) {
75 var recvAsync = new SocketAsyncEventArgs ();
76 recvAsync.Completed += (sender, args) => OnReceived (args);
77 recvAsync.SetBuffer (new byte [4], 0, 4);
78 if (!acceptSocket.ReceiveAsync (recvAsync))
79 OnReceived (recvAsync);
84 void OnReceived (SocketAsyncEventArgs e)
86 if (e.SocketError != SocketError.Success)
87 error = new SocketException ((int) e.SocketError);
88 else if (e.Buffer [0] != 0x9a)
89 error = new InvalidOperationException ();
96 public void SendAsync ()
98 var buffer = new byte [] { 0x12, 0x34, 0x56, 0x78 };
99 var m = new ManualResetEvent (false);
100 var e = new SocketAsyncEventArgs ();
101 e.SetBuffer (buffer, 0, buffer.Length);
102 e.Completed += (s,o) => {
103 if (o.SocketError != SocketError.Success)
104 error = new SocketException ((int)o.SocketError);
107 bool res = clientSocket.SendAsync (e);
109 if (!m.WaitOne (1500))
110 Assert.Fail ("Timeout #1");
113 if (!mainEvent.WaitOne (1500))
114 Assert.Fail ("Timeout #2");
125 res = clientSocket.SendAsync (e);
127 if (!m.WaitOne (1500))
128 Assert.Fail ("Timeout #3");
131 if (!mainEvent.WaitOne (1500))
132 Assert.Fail ("Timeout #4");