+using System;
using System.Threading;
using System.Net;
using System.Net.Sockets;
public class SocketAcceptAsyncTest
{
[Test]
+#if FEATURE_NO_BSD_SOCKETS
+ [ExpectedException (typeof (PlatformNotSupportedException))]
+#endif
public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
{
var readyEvent = new ManualResetEvent(false);
var serverSocket = new Socket(
AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Socket acceptedSocket = null;
-
+ Exception ex = null;
ThreadPool.QueueUserWorkItem(_ =>
{
- listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
- listenSocket.Listen(1);
-
- var asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
- asyncEventArgs.Completed += (s, e) =>
- {
- acceptedSocket = e.AcceptSocket;
- mainEvent.Set();
- };
+ SocketAsyncEventArgs asyncEventArgs;
+ try {
+ listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
+ listenSocket.Listen(1);
- readyEvent.Set();
+ asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
+ asyncEventArgs.Completed += (s, e) =>
+ {
+ acceptedSocket = e.AcceptSocket;
+ mainEvent.Set();
+ };
- if (listenSocket.AcceptAsync(asyncEventArgs))
+ } catch (Exception e) {
+ ex = e;
return;
- acceptedSocket = asyncEventArgs.AcceptSocket;
- mainEvent.Set();
+ } finally {
+ readyEvent.Set();
+ }
+
+ try {
+ if (listenSocket.AcceptAsync(asyncEventArgs))
+ return;
+ acceptedSocket = asyncEventArgs.AcceptSocket;
+ mainEvent.Set();
+ } catch (Exception e) {
+ ex = e;
+ }
});
Assert.IsTrue(readyEvent.WaitOne(1500));
+ if (ex != null)
+ throw ex;
var clientSocket = new Socket(
AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.NoDelay = true;
Assert.IsTrue(mainEvent.WaitOne(1500));
- Assert.AreEqual(serverSocket, acceptedSocket);
+ Assert.AreEqual(serverSocket, acceptedSocket, "x");
mainEvent.Reset();
if (acceptedSocket != null)