1

サブネット化された 2 台の異なるコンピュータを接続するにはどうすればよいですか? たとえば、次のように言いましょう。

外部から見える 222.251.155.20 に接続された 192.168.1.92。外部から見える 223.251.156.23 に接続された 192.168.1.102。

現在、両方のマシンが接続されている仲介者サーバーがあり、互いの内部 IP と外部 IP をネゴシエートし、リッスン ポートを開くことができます。これを行う方法を現在知っている唯一の方法は、ポート転送です。

私は C# ソケットにかなり精通していますが、2 つの異なるサブネット上にある 2 台のコンピューターを接続する方法は知りません。

クライアントが接続するドメイン名を持つサーバーがあります。通常、クライアントはホームルーターの背後にあり、相互に情報を直接共有できるようにしたいと考えています。

4

1 に答える 1

1

あなたが探しているのはNAT traversalです。中継サーバーとポート フォワーディングを使用しないソリューションでは、通常、何らかの形式のUDP ホール パンチングを使用します。標準化されたメカニズムは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);
    }
}
于 2009-12-12T22:35:30.063 に答える