SocketAcceptAsyncTest.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. using System;
  2. using System.Threading;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using NUnit.Framework;
  6. namespace MonoTests.System.Net.Sockets
  7. {
  8. [TestFixture]
  9. public class SocketAcceptAsyncTest
  10. {
  11. [Test]
  12. #if FEATURE_NO_BSD_SOCKETS
  13. [ExpectedException (typeof (PlatformNotSupportedException))]
  14. #endif
  15. public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
  16. {
  17. var readyEvent = new ManualResetEvent(false);
  18. var mainEvent = new ManualResetEvent(false);
  19. var listenSocket = new Socket(
  20. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  21. var serverSocket = new Socket(
  22. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  23. Socket acceptedSocket = null;
  24. Exception ex = null;
  25. ThreadPool.QueueUserWorkItem(_ =>
  26. {
  27. SocketAsyncEventArgs asyncEventArgs;
  28. try {
  29. listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
  30. listenSocket.Listen(1);
  31. asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
  32. asyncEventArgs.Completed += (s, e) =>
  33. {
  34. acceptedSocket = e.AcceptSocket;
  35. mainEvent.Set();
  36. };
  37. } catch (Exception e) {
  38. ex = e;
  39. return;
  40. } finally {
  41. readyEvent.Set();
  42. }
  43. try {
  44. if (listenSocket.AcceptAsync(asyncEventArgs))
  45. return;
  46. acceptedSocket = asyncEventArgs.AcceptSocket;
  47. mainEvent.Set();
  48. } catch (Exception e) {
  49. ex = e;
  50. }
  51. });
  52. Assert.IsTrue(readyEvent.WaitOne(1500));
  53. if (ex != null)
  54. throw ex;
  55. var clientSocket = new Socket(
  56. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  57. clientSocket.Connect(listenSocket.LocalEndPoint);
  58. clientSocket.NoDelay = true;
  59. Assert.IsTrue(mainEvent.WaitOne(1500));
  60. Assert.AreEqual(serverSocket, acceptedSocket, "x");
  61. mainEvent.Reset();
  62. if (acceptedSocket != null)
  63. acceptedSocket.Close();
  64. listenSocket.Close();
  65. readyEvent.Close();
  66. mainEvent.Close();
  67. }
  68. }
  69. }