SocketAcceptAsyncTest.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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. public class SocketAcceptAsyncTest
  9. {
  10. [Test]
  11. #if FEATURE_NO_BSD_SOCKETS
  12. [ExpectedException (typeof (PlatformNotSupportedException))]
  13. #endif
  14. public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
  15. {
  16. var readyEvent = new ManualResetEvent(false);
  17. var mainEvent = new ManualResetEvent(false);
  18. var listenSocket = new Socket(
  19. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  20. var serverSocket = new Socket(
  21. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  22. Socket acceptedSocket = null;
  23. Exception ex = null;
  24. ThreadPool.QueueUserWorkItem(_ =>
  25. {
  26. SocketAsyncEventArgs asyncEventArgs;
  27. try {
  28. listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
  29. listenSocket.Listen(1);
  30. asyncEventArgs = new SocketAsyncEventArgs {AcceptSocket = serverSocket};
  31. asyncEventArgs.Completed += (s, e) =>
  32. {
  33. acceptedSocket = e.AcceptSocket;
  34. mainEvent.Set();
  35. };
  36. } catch (Exception e) {
  37. ex = e;
  38. return;
  39. } finally {
  40. readyEvent.Set();
  41. }
  42. try {
  43. if (listenSocket.AcceptAsync(asyncEventArgs))
  44. return;
  45. acceptedSocket = asyncEventArgs.AcceptSocket;
  46. } catch (Exception e) {
  47. ex = e;
  48. } finally {
  49. mainEvent.Set();
  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);
  61. mainEvent.Reset();
  62. if (acceptedSocket != null)
  63. acceptedSocket.Close();
  64. listenSocket.Close();
  65. readyEvent.Close();
  66. mainEvent.Close();
  67. }
  68. }
  69. }