| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- using System;
- using System.Collections;
- using System.Threading;
- using System.Net;
- using System.Net.Sockets;
- using NUnit.Framework;
- namespace MonoTests.System.Net.Sockets
- {
- [TestFixture]
- public class SocketConnectAsyncTest
- {
- Socket serverSocket;
- Socket clientSocket;
- SocketAsyncEventArgs clientSocketAsyncArgs;
- ManualResetEvent readyEvent;
- ManualResetEvent mainEvent;
- Exception error;
- [TestFixtureSetUp]
- public void SetUp ()
- {
- readyEvent = new ManualResetEvent (false);
- mainEvent = new ManualResetEvent (false);
- }
- [TestFixtureTearDown]
- public void TearDown ()
- {
- readyEvent.Close ();
- mainEvent.Close ();
- }
- void StartServer()
- {
- readyEvent.Reset();
- mainEvent.Reset();
- ThreadPool.QueueUserWorkItem (_ => DoWork ());
- readyEvent.WaitOne ();
- }
- void StopServer()
- {
- if (serverSocket != null)
- serverSocket.Close ();
- }
- void DoWork ()
- {
- serverSocket = new Socket (
- AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- serverSocket.Bind (new IPEndPoint (IPAddress.Loopback, 0));
- serverSocket.Listen (1);
- var async = new SocketAsyncEventArgs ();
- async.Completed += (s,e) => OnAccepted (e);
- readyEvent.Set ();
- if (!serverSocket.AcceptAsync (async))
- OnAccepted (async);
- }
- void OnAccepted (SocketAsyncEventArgs e)
- {
- var acceptSocket = e.AcceptSocket;
- mainEvent.Set ();
- }
- [Test]
- [Category("NotWorking")]
- public void Connect ()
- {
- StartServer();
- EndPoint serverEndpoint = serverSocket.LocalEndPoint;
- var m = new ManualResetEvent (false);
- var e = new SocketAsyncEventArgs ();
- clientSocket = new Socket (
- AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- clientSocketAsyncArgs = new SocketAsyncEventArgs();
- clientSocketAsyncArgs.RemoteEndPoint = serverEndpoint;
- clientSocketAsyncArgs.Completed += (s,o) => {
- if (o.SocketError != SocketError.Success)
- error = new SocketException ((int)o.SocketError);
- m.Set ();
- };
- bool res = clientSocket.ConnectAsync(clientSocketAsyncArgs);
- if (res) {
- if (!m.WaitOne (1500))
- throw new TimeoutException ();
- }
- if (!mainEvent.WaitOne (1500))
- throw new TimeoutException ();
- if (error != null)
- throw error;
- m.Reset ();
- mainEvent.Reset ();
- StopServer();
- // Try again to non-listening endpoint, expect error
- error = null;
- clientSocket = new Socket (
- AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- clientSocketAsyncArgs = new SocketAsyncEventArgs ();
- clientSocketAsyncArgs.RemoteEndPoint = serverEndpoint;
- clientSocketAsyncArgs.Completed += (s,o) => {
- if (o.SocketError != SocketError.Success)
- error = new SocketException ((int)o.SocketError);
- m.Set ();
- };
- res = clientSocket.ConnectAsync (clientSocketAsyncArgs);
- if (res) {
- if (!m.WaitOne (1500))
- throw new TimeoutException ();
- }
- Assert.IsTrue (error != null, "Connect - no error");
- SocketException socketException = (SocketException)error;
- Assert.IsTrue(socketException.ErrorCode == (int)SocketError.ConnectionRefused);
-
- m.Reset ();
- mainEvent.Reset ();
- }
- }
- }
|