SocketAcceptAsyncTest.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. private Socket _listenSocket;
  12. private Socket _clientSocket;
  13. private Socket _serverSocket;
  14. private Socket _acceptedSocket;
  15. private ManualResetEvent _readyEvent;
  16. private ManualResetEvent _mainEvent;
  17. [TestFixtureSetUp]
  18. public void SetUp()
  19. {
  20. _readyEvent = new ManualResetEvent(false);
  21. _mainEvent = new ManualResetEvent(false);
  22. ThreadPool.QueueUserWorkItem(_ => StartListen());
  23. Assert.IsTrue(_readyEvent.WaitOne(1500));
  24. _clientSocket = new Socket(
  25. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  26. _clientSocket.Connect(_listenSocket.LocalEndPoint);
  27. _clientSocket.NoDelay = true;
  28. }
  29. [TestFixtureTearDown]
  30. public void TearDown()
  31. {
  32. if (_acceptedSocket != null)
  33. _acceptedSocket.Close();
  34. if (_listenSocket != null)
  35. _listenSocket.Close();
  36. _readyEvent.Close();
  37. _mainEvent.Close();
  38. }
  39. private void StartListen()
  40. {
  41. _listenSocket = new Socket(
  42. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  43. _listenSocket.Bind(new IPEndPoint(IPAddress.Loopback, 0));
  44. _listenSocket.Listen(1);
  45. _serverSocket = new Socket(
  46. AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  47. var async = new SocketAsyncEventArgs();
  48. async.AcceptSocket = _serverSocket;
  49. async.Completed += (s, e) => OnAccepted(e);
  50. _readyEvent.Set();
  51. if (!_listenSocket.AcceptAsync(async))
  52. OnAccepted(async);
  53. }
  54. private void OnAccepted(SocketAsyncEventArgs e)
  55. {
  56. _acceptedSocket = e.AcceptSocket;
  57. _mainEvent.Set();
  58. }
  59. [Test]
  60. public void AcceptAsyncShouldUseAcceptSocketFromEventArgs()
  61. {
  62. Assert.IsTrue(_mainEvent.WaitOne(1500));
  63. Assert.AreEqual(_serverSocket, _acceptedSocket);
  64. _mainEvent.Reset();
  65. }
  66. }
  67. }