SocketAcceptAsyncTest.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System.Threading;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using NUnit.Framework;
  5. namespace MonoTests.System.Net.Sockets
  6. {
  7. [TestFixture]
  8. [Category ("RequiresBSDSockets")]
  9. public class SocketAcceptAsyncTest
  10. {
  11. [Test]
  12. public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
  13. {
  14. var readyEvent = new ManualResetEvent(false);
  15. var mainEvent = new ManualResetEvent(false);
  16. var listenSocket = new Socket(
  17. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  18. var serverSocket = new Socket(
  19. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  20. Socket acceptedSocket = null;
  21. ThreadPool.QueueUserWorkItem(_ =>
  22. {
  23. listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
  24. listenSocket.Listen(1);
  25. var asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
  26. asyncEventArgs.Completed += (s, e) =>
  27. {
  28. acceptedSocket = e.AcceptSocket;
  29. mainEvent.Set();
  30. };
  31. readyEvent.Set();
  32. if (listenSocket.AcceptAsync(asyncEventArgs))
  33. return;
  34. acceptedSocket = asyncEventArgs.AcceptSocket;
  35. mainEvent.Set();
  36. });
  37. Assert.IsTrue(readyEvent.WaitOne(1500));
  38. var clientSocket = new Socket(
  39. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  40. clientSocket.Connect(listenSocket.LocalEndPoint);
  41. clientSocket.NoDelay = true;
  42. Assert.IsTrue(mainEvent.WaitOne(1500));
  43. Assert.AreEqual(serverSocket, acceptedSocket);
  44. mainEvent.Reset();
  45. if (acceptedSocket != null)
  46. acceptedSocket.Close();
  47. listenSocket.Close();
  48. readyEvent.Close();
  49. mainEvent.Close();
  50. }
  51. }
  52. }