gpt4 book ai didi

c# - 连接 2 台不同的子网计算机

转载 作者:可可西里 更新时间:2023-11-01 02:53:05 25 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

您要找的是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);
}
}

关于c# - 连接 2 台不同的子网计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1894871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com