/// <summary> /// Connects to a peer in the peer-to-peer network. If the remote end point resides behind the same firewall as the current application, /// a direct connection to the local peer is made, for improved performance. /// </summary> /// <param name="RemoteEndPoint">Remote End-point.</param> /// <returns>Peer connection</returns> public PeerConnection ConnectToPeer(IPEndPoint RemoteEndPoint) { if (this.state != PeerToPeerNetworkState.Ready) { throw new IOException("Peer-to-peer network not ready."); } TcpClient Client = new TcpClient(new IPEndPoint(this.localAddress, 0)); IPEndPoint RemoteEndPoint2; try { if (IPAddress.Equals(RemoteEndPoint.Address, this.externalAddress)) { this.serviceWANIPConnectionV1.GetSpecificPortMappingEntry(string.Empty, (ushort)RemoteEndPoint.Port, "TCP", out ushort InternalPort, out string InternalClient, out bool Enabled, out string PortMappingDescription, out uint LeaseDuration); RemoteEndPoint2 = new IPEndPoint(IPAddress.Parse(InternalClient), InternalPort); Client.Connect(RemoteEndPoint2); } else { RemoteEndPoint2 = RemoteEndPoint; Client.Connect(RemoteEndPoint); } } catch (Exception) { Client.Close(); throw; } PeerConnection Result = new PeerConnection(Client, this, RemoteEndPoint2); Result.StartIdleTimer(); return(Result); }
/// <summary> /// Connects to a peer in the peer-to-peer network. If the remote end point resides behind the same firewall as the current application, /// a direct connection to the local peer is made, for improved performance. /// </summary> /// <param name="RemoteEndPoint">Remote End-point.</param> /// <returns>Peer connection</returns> public PeerConnection ConnectToPeer(IPEndPoint RemoteEndPoint) { if (this.state != PeerToPeerNetworkState.Ready) throw new IOException("Peer-to-peer network not ready."); TcpClient Client = new TcpClient(new IPEndPoint(this.localAddress, 0)); IPEndPoint RemoteEndPoint2; try { if (IPAddress.Equals(RemoteEndPoint.Address, this.externalAddress)) { ushort InternalPort; string InternalClient; string PortMappingDescription; uint LeaseDuration; bool Enabled; this.serviceWANIPConnectionV1.GetSpecificPortMappingEntry(string.Empty, (ushort)RemoteEndPoint.Port, "TCP", out InternalPort, out InternalClient, out Enabled, out PortMappingDescription, out LeaseDuration); RemoteEndPoint2 = new IPEndPoint(IPAddress.Parse(InternalClient), InternalPort); Client.Connect(RemoteEndPoint2); } else { RemoteEndPoint2 = RemoteEndPoint; Client.Connect(RemoteEndPoint); } } catch (Exception) { Client.Close(); throw; } PeerConnection Result = new PeerConnection(Client, this, RemoteEndPoint2); Result.StartIdleTimer(); return Result; }