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
;
21 readyEvent
= new ManualResetEvent (false);
22 mainEvent
= new ManualResetEvent (false);
24 ThreadPool
.QueueUserWorkItem (_
=> DoWork ());
25 readyEvent
.WaitOne ();
30 clientSocket
= new Socket (
31 AddressFamily
.InterNetwork
, SocketType
.Stream
, ProtocolType
.Tcp
);
32 clientSocket
.Connect (serverSocket
.LocalEndPoint
);
33 clientSocket
.NoDelay
= true;
37 public void TearDown ()
39 if (serverSocket
!= null)
40 serverSocket
.Close ();
48 serverSocket
= new Socket (
49 AddressFamily
.InterNetwork
, SocketType
.Stream
, ProtocolType
.Tcp
);
50 serverSocket
.Bind (new IPEndPoint (IPAddress
.Loopback
, 0));
51 serverSocket
.Listen (1);
53 var async = new SocketAsyncEventArgs ();
54 async.Completed
+= (s
,e
) => OnAccepted (e
);
56 if (!serverSocket
.AcceptAsync (async))
58 } catch (Exception e
) {
65 void OnAccepted (SocketAsyncEventArgs e
)
67 var acceptSocket
= e
.AcceptSocket
;
70 var header
= new byte [4];
71 acceptSocket
.Receive (header
);
72 if ((header
[0] != 0x12) || (header
[1] != 0x34) ||
73 (header
[2] != 0x56) || (header
[3] != 0x78))
74 throw new InvalidOperationException ();
75 } catch (Exception ex
) {
80 var recvAsync
= new SocketAsyncEventArgs ();
81 recvAsync
.Completed
+= (sender
, args
) => OnReceived (args
);
82 recvAsync
.SetBuffer (new byte [4], 0, 4);
83 if (!acceptSocket
.ReceiveAsync (recvAsync
))
84 OnReceived (recvAsync
);
89 void OnReceived (SocketAsyncEventArgs e
)
91 if (e
.SocketError
!= SocketError
.Success
)
92 error
= new SocketException ((int) e
.SocketError
);
93 else if (e
.Buffer
[0] != 0x9a)
94 error
= new InvalidOperationException ();
101 [Category("MultiThreaded")]
102 #if FEATURE_NO_BSD_SOCKETS
103 [ExpectedException (typeof (PlatformNotSupportedException
))]
105 public void SendAsync ()
108 var buffer
= new byte [] { 0x12, 0x34, 0x56, 0x78 }
;
109 var m
= new ManualResetEvent (false);
110 var e
= new SocketAsyncEventArgs ();
111 e
.SetBuffer (buffer
, 0, buffer
.Length
);
112 e
.Completed
+= (s
,o
) => {
113 if (o
.SocketError
!= SocketError
.Success
)
114 error
= new SocketException ((int)o
.SocketError
);
117 bool res
= clientSocket
.SendAsync (e
);
119 if (!m
.WaitOne (1500))
120 Assert
.Fail ("Timeout #1");
123 if (!mainEvent
.WaitOne (1500))
124 Assert
.Fail ("Timeout #2");
135 res
= clientSocket
.SendAsync (e
);
137 if (!m
.WaitOne (1500))
138 Assert
.Fail ("Timeout #3");
141 if (!mainEvent
.WaitOne (1500))
142 Assert
.Fail ("Timeout #4");