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); }
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); }