SocketAsyncTest.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System;
  2. using System.Collections;
  3. using System.Threading;
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using NUnit.Framework;
  7. namespace MonoTests.System.Net.Sockets
  8. {
  9. [TestFixture]
  10. [Category ("RequiresBSDSockets")]
  11. public class SocketAsyncTest
  12. {
  13. Socket serverSocket;
  14. Socket clientSocket;
  15. ManualResetEvent readyEvent;
  16. ManualResetEvent mainEvent;
  17. Exception error;
  18. [TestFixtureSetUp]
  19. public void SetUp ()
  20. {
  21. readyEvent = new ManualResetEvent (false);
  22. mainEvent = new ManualResetEvent (false);
  23. ThreadPool.QueueUserWorkItem (_ => DoWork ());
  24. readyEvent.WaitOne ();
  25. clientSocket = new Socket (
  26. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  27. clientSocket.Connect (serverSocket.LocalEndPoint);
  28. clientSocket.NoDelay = true;
  29. }
  30. [TestFixtureTearDown]
  31. public void TearDown ()
  32. {
  33. if (serverSocket != null)
  34. serverSocket.Close ();
  35. readyEvent.Close ();
  36. mainEvent.Close ();
  37. }
  38. void DoWork ()
  39. {
  40. serverSocket = new Socket (
  41. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  42. serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
  43. serverSocket.Listen (1);
  44. var async = new SocketAsyncEventArgs ();
  45. async.Completed += (s,e) => OnAccepted (e);
  46. readyEvent.Set ();
  47. if (!serverSocket.AcceptAsync (async))
  48. OnAccepted (async);
  49. }
  50. void OnAccepted (SocketAsyncEventArgs e)
  51. {
  52. var acceptSocket = e.AcceptSocket;
  53. try {
  54. var header = new byte [4];
  55. acceptSocket.Receive (header);
  56. if ((header [0] != 0x12) || (header [1] != 0x34) ||
  57. (header [2] != 0x56) || (header [3] != 0x78))
  58. throw new InvalidOperationException ();
  59. } catch (Exception ex) {
  60. error = ex;
  61. return;
  62. }
  63. var recvAsync = new SocketAsyncEventArgs ();
  64. recvAsync.Completed += (sender, args) => OnReceived (args);
  65. recvAsync.SetBuffer (new byte [4], 0, 4);
  66. if (!acceptSocket.ReceiveAsync (recvAsync))
  67. OnReceived (recvAsync);
  68. mainEvent.Set ();
  69. }
  70. void OnReceived (SocketAsyncEventArgs e)
  71. {
  72. if (e.SocketError != SocketError.Success)
  73. error = new SocketException ((int) e.SocketError);
  74. else if (e.Buffer [0] != 0x9a)
  75. error = new InvalidOperationException ();
  76. mainEvent.Set ();
  77. }
  78. [Test]
  79. [Category("Test")]
  80. public void SendAsync ()
  81. {
  82. var buffer = new byte [] { 0x12, 0x34, 0x56, 0x78 };
  83. var m = new ManualResetEvent (false);
  84. var e = new SocketAsyncEventArgs ();
  85. e.SetBuffer (buffer, 0, buffer.Length);
  86. e.Completed += (s,o) => {
  87. if (o.SocketError != SocketError.Success)
  88. error = new SocketException ((int)o.SocketError);
  89. m.Set ();
  90. };
  91. bool res = clientSocket.SendAsync (e);
  92. if (res) {
  93. if (!m.WaitOne (1500))
  94. Assert.Fail ("Timeout #1");
  95. }
  96. if (!mainEvent.WaitOne (1500))
  97. Assert.Fail ("Timeout #2");
  98. if (error != null)
  99. throw error;
  100. m.Reset ();
  101. mainEvent.Reset ();
  102. buffer [0] = 0x9a;
  103. buffer [1] = 0xbc;
  104. buffer [2] = 0xde;
  105. buffer [3] = 0xff;
  106. res = clientSocket.SendAsync (e);
  107. if (res) {
  108. if (!m.WaitOne (1500))
  109. Assert.Fail ("Timeout #3");
  110. }
  111. if (!mainEvent.WaitOne (1500))
  112. Assert.Fail ("Timeout #4");
  113. if (error != null)
  114. throw error;
  115. }
  116. }
  117. }