1

如何连接 2 台不同的子网计算机?例如,让我们说以下内容:

192.168.1.92 连接到外部可见的 222.251.155.20。192.168.1.102 连接到外部可见的 223.251.156.23。

现在,两台机器都连接到中间人服务器,因此它们可以协商彼此的内部和外部 IP,并让其中一个打开侦听端口。我目前知道如何做到这一点的唯一方法是端口转发。

我对 C# 套接字相当精通,只是不知道如何连接位于两个不同子网上的两台计算机。

我有一个客户端连接到的具有域名的服务器,通常客户端将位于家庭路由器后面,我希望它们能够直接相互共享信息。

4

1 回答 1

1

您正在寻找的是NAT traversal。没有中继服务器和端口转发的解决方案通常使用某种形式的UDP 打孔。一种标准化的机制是STUN(即交互式连接建立)。

注意:通过 UDP 实现 UDP 打孔和可靠的文件传输并非易事。最好的选择可能是使用 UPnP 或 NAT-PMP 自动设置端口转发。两者都有库,例如Mono.Nat ( sources ):

class NatTest
{
    public Start ()
    {
        // Hook into the events so you know when a router
        // has been detected or has gone offline
        NatUtility.DeviceFound += DeviceFound;
        NatUtility.DeviceLost += DeviceLost;

        // Start searching for upnp enabled routers
        NatUtility.StartDiscovery ();
    }

    void DeviceFound(object sender, DeviceEventArgs args)
    {
        // This is the upnp enabled router
        INatDevice device = args.Device;

        // Create a mapping to forward external port 3000 to local port 1500
        device.CreatePortMap(new Mapping(Protocol.Tcp, 1500, 3000));

        // Retrieve the details for the port map for external port 3000
        Mapping m = device.GetSpecificMapping(Protocol.Tcp, 3000);

        // Get all the port mappings on the device and delete them
        foreach (Mapping mp in device.GetAllMappings())
            device.DeletePortMap(mp);

        // Get the external IP address
        IPAddress externalIP = device.GetExternalIP();
    }

    private void DeviceLost (object sender, DeviceEventArgs args)
    {
        INatDevice device = args.Device;

        Console.WriteLine ("Device Lost");
        Console.WriteLine ("Type: {0}", device.GetType().Name);
    }
}
于 2009-12-12T22:35:30.063 回答