2 using System.Collections;
3 using System.Threading;
5 using System.Net.Sockets;
8 namespace MonoTests.System.Net.Sockets
11 public class SocketAsyncTest
15 ManualResetEvent readyEvent;
16 ManualResetEvent mainEvent;
22 readyEvent = new ManualResetEvent (false);
23 mainEvent = new ManualResetEvent (false);
25 ThreadPool.QueueUserWorkItem (_ => DoWork ());
26 readyEvent.WaitOne ();
28 clientSocket = new Socket (
29 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
30 clientSocket.Connect (serverSocket.LocalEndPoint);
31 clientSocket.NoDelay = true;
35 public void TearDown ()
37 if (serverSocket != null)
38 serverSocket.Close ();
45 serverSocket = new Socket (
46 AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
47 serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
48 serverSocket.Listen (1);
50 var async = new SocketAsyncEventArgs ();
51 async.Completed += (s,e) => OnAccepted (e);
55 if (!serverSocket.AcceptAsync (async))
59 void OnAccepted (SocketAsyncEventArgs e)
61 var acceptSocket = e.AcceptSocket;
64 var header = new byte [4];
65 acceptSocket.Receive (header);
66 if ((header [0] != 0x12) || (header [1] != 0x34) ||
67 (header [2] != 0x56) || (header [3] != 0x78))
68 throw new InvalidOperationException ();
69 } catch (Exception ex) {
74 var recvAsync = new SocketAsyncEventArgs ();
75 recvAsync.Completed += (sender, args) => OnReceived (args);
76 recvAsync.SetBuffer (new byte [4], 0, 4);
77 if (!acceptSocket.ReceiveAsync (recvAsync))
78 OnReceived (recvAsync);
83 void OnReceived (SocketAsyncEventArgs e)
85 if (e.SocketError != SocketError.Success)
86 error = new SocketException ((int) e.SocketError);
87 else if (e.Buffer [0] != 0x9a)
88 error = new InvalidOperationException ();
95 public void SendAsync ()
97 var buffer = new byte [] { 0x12, 0x34, 0x56, 0x78 };
98 var m = new ManualResetEvent (false);
99 var e = new SocketAsyncEventArgs ();
100 e.SetBuffer (buffer, 0, buffer.Length);
101 e.Completed += (s,o) => {
102 if (o.SocketError != SocketError.Success)
103 error = new SocketException ((int)o.SocketError);
106 bool res = clientSocket.SendAsync (e);
108 if (!m.WaitOne (1500))
109 Assert.Fail ("Timeout #1");
112 if (!mainEvent.WaitOne (1500))
113 Assert.Fail ("Timeout #2");
124 res = clientSocket.SendAsync (e);
126 if (!m.WaitOne (1500))
127 Assert.Fail ("Timeout #3");
130 if (!mainEvent.WaitOne (1500))
131 Assert.Fail ("Timeout #4");