예제 #1
0
        public static async Task <Socket> ConnectAsync(string host, int port, IPEndPoint localEndPoint, bool doAsync, CancellationToken cancellationToken)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var socket = new Socket(SocketType.Stream, ProtocolType.Tcp);

            try {
                if (localEndPoint != null)
                {
                    socket.Bind(localEndPoint);
                }

                if (doAsync || cancellationToken.CanBeCanceled)
                {
                    var state = new AsyncConnectState(socket, host, port, cancellationToken);

                    if (doAsync)
                    {
                        await Task.Factory.FromAsync(BeginConnectAsync, EndConnectAsync, state).ConfigureAwait(false);
                    }
                    else
                    {
                        var ar = socket.BeginConnect(host, port, EndConnect, state);
                        Wait(ar, cancellationToken);
                        state.Throw();
                    }
                }
                else
                {
                    socket.Connect(host, port);
                }
            } catch (OperationCanceledException) {
                if (socket.Connected)
                {
                    socket.Disconnect(false);
                }

                socket.Dispose();
                throw;
            } catch {
                socket.Dispose();
                throw;
            }

            return(socket);
        }
예제 #2
0
        internal void ConnectToPeer(TorrentManager manager, Peer peer)
        {
            // Connect to the peer.
            var connection = ConnectionFactory.Create(peer.ConnectionUri);

            if (connection == null)
            {
                return;
            }

            peer.LastConnectionAttempt = DateTime.Now;
            var c = new AsyncConnectState(manager, peer, connection);

            _pendingConnects.Add(c);

            manager.Peers.ConnectingToPeers.Add(peer);
            NetworkIO.EnqueueConnect(connection, _endCreateConnectionCallback, c);
        }