SocketAsyncTest.cs 3.1 KB

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