【问题标题】:Connecting 2 different sub neted computers连接 2 台不同的子网计算机
【发布时间】:2009-12-12 22:17:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • “连接到外部可见” = NAT?
  • 这个“中间人服务器”是什么? STUN/TURN 服务器?
  • 他们不在同一个子网,222.251.155.20 != 223.251.156.23
  • 中间人是主服务器,但我希望两个客户端能够相互连接以共享文件,而无需中间人服务器。

标签: c# tcp sockets udp subnet


【解决方案1】:

您正在寻找的是NAT traversal。 没有中继服务器和端口转发的解决方案通常使用某种形式的UDP hole punching。 一个标准化的机制是STUN(即Interactive Connectivity Establishment)。

注意:通过 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);
    }
}

【讨论】:

  • 所以我让他们在他们的路由器上打开一个端口并让它像端口转发一样重定向到他们?
  • codeproject.com/KB/IP/upnpnattraversal.aspx 前段时间看到这个,这是我需要做的吗?认为它似乎过于复杂,但如果设置转发是我必须做的。
  • 我没试过,但 Mono.Nat 似乎很容易使用。我添加了一些示例代码。
  • 好的,我试一试,谢谢。如果它有效,我会标记它。
  • 坏消息没用,有点破。但是你让我走上了正确的道路,我找到了一个有效的解决方案code.google.com/p/tcmportmapper 效果很好。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 1970-01-01
相关资源
最近更新 更多