Пример #1
0
        public void RemoteEndPoint()
        {
            CompletionPort completionPort = CompletionPort.Create();

            var listenSocket = AsyncSocket.CreateIPv4Tcp();

            completionPort.AssociateSocket(listenSocket, null);
            listenSocket.Bind(IPAddress.Any, 0);
            int port = listenSocket.LocalEndPoint.Port;

            listenSocket.Listen(1);

            listenSocket.Accept();

            var clientSocket = AsyncSocket.CreateIPv4Tcp();

            completionPort.AssociateSocket(clientSocket, null);
            clientSocket.Bind(IPAddress.Any, 0);
            clientSocket.Connect("localhost", port);

            CompletionStatus completionStatus;

            bool accepted  = false;
            bool connected = false;

            while (!accepted || !connected)
            {
                completionPort.GetQueuedCompletionStatus(-1, out completionStatus);

                if (completionStatus.AsyncSocket == clientSocket && !connected)
                {
                    Assert.AreEqual(OperationType.Connect, completionStatus.OperationType);
                    Assert.AreEqual(SocketError.Success, completionStatus.SocketError);
                    connected = true;
                }
                else if (completionStatus.AsyncSocket == listenSocket && !accepted)
                {
                    Assert.AreEqual(OperationType.Accept, completionStatus.OperationType);
                    Assert.AreEqual(SocketError.Success, completionStatus.SocketError);
                    accepted = true;
                }
                else
                {
                    Assert.Fail();
                }
            }

            var server = listenSocket.GetAcceptedSocket();

            Assert.AreEqual(clientSocket.LocalEndPoint, server.RemoteEndPoint);
            Assert.AreEqual(clientSocket.RemoteEndPoint, server.LocalEndPoint);

            completionPort.Dispose();
            listenSocket.Dispose();
            server.Dispose();
            clientSocket.Dispose();
        }
Пример #2
0
        private void Loop()
        {
            CompletionStatus completionStatus;

            while (!m_stopping)
            {
                //  Execute any due timers.
                int timeout = ExecuteTimers();

                if (m_completionPort.GetQueuedCompletionStatus(timeout != 0 ? timeout * 1000 : -1, out completionStatus))
                {
                    if (completionStatus.OperationType == OperationType.Signal)
                    {
                        IOThreadMailbox mailbox = (IOThreadMailbox)completionStatus.State;
                        mailbox.RaiseEvent();
                    }
                    // if the state is null we just ignore the completion status
                    else if (completionStatus.State != null)
                    {
                        Item item = (Item)completionStatus.State;

                        if (!item.Cancelled)
                        {
                            try
                            {
                                switch (completionStatus.OperationType)
                                {
                                case OperationType.Accept:
                                case OperationType.Receive:
                                    item.ProcatorEvents.InCompleted(completionStatus.SocketError,
                                                                    completionStatus.BytesTransferred);
                                    break;

                                case OperationType.Connect:
                                case OperationType.Disconnect:
                                case OperationType.Send:
                                    item.ProcatorEvents.OutCompleted(completionStatus.SocketError,
                                                                     completionStatus.BytesTransferred);
                                    break;

                                default:
                                    throw new ArgumentOutOfRangeException();
                                }
                            }
                            catch (TerminatingException)
                            {
                            }
                        }
                    }
                }
            }
        }
Пример #3
0
        public static void Main(string[] args)
        {
            CompletionPort completionPort = CompletionPort.Create();

            AutoResetEvent listenerEvent = new AutoResetEvent(false);
            AutoResetEvent clientEvent   = new AutoResetEvent(false);
            AutoResetEvent serverEvent   = new AutoResetEvent(false);

            AsyncSocket listener = AsyncSocket.Create(AddressFamily.InterNetwork,
                                                      SocketType.Stream, ProtocolType.Tcp);

            completionPort.AssociateSocket(listener, listenerEvent);

            AsyncSocket server = AsyncSocket.Create(AddressFamily.InterNetwork,
                                                    SocketType.Stream, ProtocolType.Tcp);

            completionPort.AssociateSocket(server, serverEvent);

            AsyncSocket client = AsyncSocket.Create(AddressFamily.InterNetwork,
                                                    SocketType.Stream, ProtocolType.Tcp);

            completionPort.AssociateSocket(client, clientEvent);

            Task.Factory.StartNew(() =>
            {
                CompletionStatus completionStatus;

                while (true)
                {
                    var result = completionPort.GetQueuedCompletionStatus(-1, out completionStatus);

                    if (result)
                    {
                        Console.WriteLine("{0} {1} {2}", completionStatus.SocketError,
                                          completionStatus.OperationType, completionStatus.BytesTransferred);

                        if (completionStatus.State != null)
                        {
                            AutoResetEvent resetEvent = (AutoResetEvent)completionStatus.State;
                            resetEvent.Set();
                        }
                    }
                }
            });

            listener.Bind(IPAddress.Any, 5555);
            listener.Listen(1);

            client.Connect("localhost", 5555);

            listener.Accept(server);


            listenerEvent.WaitOne();
            clientEvent.WaitOne();

            byte[] sendBuffer = new byte[1] {
                2
            };
            byte[] recvBuffer = new byte[1];

            client.Send(sendBuffer);
            server.Receive(recvBuffer);

            clientEvent.WaitOne();
            serverEvent.WaitOne();

            server.Dispose();
            client.Dispose();
            Console.ReadLine();
        }