コード例 #1
0
        private void EndAccept(IAsyncResult result)
        {
            Socket peerSocket = null;

            try
            {
                Socket listener = (Socket)result.AsyncState;
                peerSocket = listener.EndAccept(result);

                IPEndPoint  endpoint   = (IPEndPoint)peerSocket.RemoteEndPoint;
                Uri         uri        = new Uri("ipv4://" + endpoint.Address.ToString() + ':' + endpoint.Port);
                Peer        peer       = new Peer("", uri, EncryptionTypes.All);
                IConnection connection = null;
                if (peerSocket.AddressFamily == AddressFamily.InterNetwork)
                {
                    connection = new IPV4Connection(peerSocket, true);
                }
                else
                {
                    connection = new IPV6Connection(peerSocket, true);
                }


                RaiseConnectionReceived(peer, connection, null);
            }
            catch (SocketException)
            {
                // Just dump the connection
                if (peerSocket != null)
                {
                    peerSocket.Close();
                }
            }
            catch (ObjectDisposedException)
            {
                // We've stopped listening
            }
            finally
            {
                try
                {
                    if (Status == ListenerStatus.Listening)
                    {
                        listener.BeginAccept(endAcceptCallback, listener);
                    }
                }
                catch (ObjectDisposedException)
                {
                }
            }
        }
コード例 #2
0
        public async Task ConnectAsync()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);

            listener.Start();
            try {
                using var c = new IPV4Connection(new Uri($"ipv4://127.0.0.1:{((IPEndPoint) listener.LocalEndpoint).Port}"));
                var connectTask = NetworkIO.ConnectAsync(c);

                var receivingSocket = await listener.AcceptSocketAsync().WithTimeout();

                await connectTask.WithTimeout();
            } finally {
                listener.Stop();
            }
        }
コード例 #3
0
        public async Task DisposeBeforeReceive()
        {
            var listener = new TcpListener(IPAddress.Loopback, 0);

            listener.Start();
            try {
                using var c = new IPV4Connection(new Uri($"ipv4://127.0.0.1:{((IPEndPoint) listener.LocalEndpoint).Port}"));
                var connectTask = NetworkIO.ConnectAsync(c);

                var receivingSocket = await listener.AcceptSocketAsync().WithTimeout();

                await connectTask.WithTimeout();

                c.Dispose();
                Assert.AreEqual(0, await c.ReceiveAsync(new ByteBuffer(123), 0, 123).WithTimeout());
            } finally {
                listener.Stop();
            }
        }
コード例 #4
0
        void OnSocketReceived(object sender, SocketAsyncEventArgs e)
        {
            Socket socket = null;

            try {
                // Capture the socket (if any) and prepare the args for reuse
                // by ensuring AcceptSocket is null.
                socket         = e.AcceptSocket;
                e.AcceptSocket = null;

                if (e.SocketError != SocketError.Success)
                {
                    throw new SocketException((int)e.SocketError);
                }

                IConnection connection;
                if (socket.AddressFamily == AddressFamily.InterNetwork)
                {
                    connection = new IPV4Connection(socket, true);
                }
                else
                {
                    connection = new IPV6Connection(socket, true);
                }

                var peer = new Peer("", connection.Uri, EncryptionTypes.All);
                ConnectionReceived?.Invoke(this, new NewConnectionEventArgs(peer, connection, null));
            } catch {
                socket?.Close();
            }

            try {
                if (!((Socket)sender).AcceptAsync(e))
                {
                    OnSocketReceived(sender, e);
                }
            } catch {
                return;
            }
        }
コード例 #5
0
        void OnSocketReceived(object sender, SocketAsyncEventArgs e)
        {
            Socket socket = null;

            try {
                if (e.SocketError != SocketError.Success)
                {
                    throw new SocketException((int)e.SocketError);
                }
                socket = e.AcceptSocket;
                // This is a crazy quirk of the API. We need to null this
                // out if we re-use the args.
                e.AcceptSocket = null;

                IConnection connection;
                if (socket.AddressFamily == AddressFamily.InterNetwork)
                {
                    connection = new IPV4Connection(socket, true);
                }
                else
                {
                    connection = new IPV6Connection(socket, true);
                }

                var peer = new Peer("", connection.Uri, EncryptionTypes.All);
                ConnectionReceived?.Invoke(this, new NewConnectionEventArgs(peer, connection, null));
            } catch {
                socket?.Close();
            }

            try {
                if (!((Socket)sender).AcceptAsync(e))
                {
                    OnSocketReceived(sender, e);
                }
            } catch {
                return;
            }
        }
コード例 #6
0
 public void DisposeBeforeConnect()
 {
     using var c = new IPV4Connection(new Uri($"ipv4://127.0.0.1:12345"));
     c.Dispose();
     Assert.ThrowsAsync <ObjectDisposedException> (async() => await NetworkIO.ConnectAsync(c));
 }