启动从公共IP到另一个网络上的专用计算机的tcp连接

时间:2014-02-23 16:31:37

标签: c# tcp

我很难在此找到帮助资源。我知道如何使用TCPClient类在一个IP /端口/机器和另一个IP /端口/机器之间创建连接。

我怀疑当一台机器想要启动到目标机器在不同网络内的另一台机器的TCP连接时,它是如何工作的。因此,目标网络可能有数百台计算机,每台计算机都有自己的私有IP,网络将有一个公共IP地址。这将使用TCPClient类或任何其他更合适的类。

我知道我们可以使用端口,然后在网络内部端口可以转发到正确的机器,但我正在寻找像LogMeIn这样的服务使用的解决方案。基本上我想总是使用端口80,然后在需要时启动从服务器到特定机器或同一网络上其他机器的连接。

我想,理论上,我可以先从网络内部创建连接,然后在服务器上创建连接,保存详细信息并关闭连接,然后在不久的将来,当我需要时,我会重新打开连接。

因此,在我的方案中,我将在多个网络中拥有许多客户端,每个网络可能有多个内部计算机并且已安装客户端。然后在服务器上,我会在需要时启动与这些机器的连接。在每个网络中,我都希望使用端口80,原因很明显。我想从服务器而不是客户端机器启动连接的原因只是为了节省资源,我无法应对打开连接,直到最终我可能需要与他们沟通。

此外,除了安装我的客户端之外,我无法控制客户端网络。

理想情况下,我希望有c#info,可能是代码,而不是网络配置。

6 个答案:

答案 0 :(得分:3)

我以前的公司有这个要求。我们在许多不同的网络上安装了我们的客户端/服务器软件(基于C#),其中包含公共/私有IP。我找到了两种相对简单的方法来解决它。首先,我想说,如果没有公共IP,就无法可靠地连接(根据我的经验)。

当我提出解决方案时,我以这种方式向其他开发人员/经理解释了这个问题。

您的服务器,具有公共IP地址的机器[公共到客户端,但可能仍然是“内部地址”],就像没有任何长途呼叫的房子。它可以接听电话,但不能拨打任何电话。客户就像是长途服务的房子。客户端必须调用服务器,因为它们距离很远。一旦连接,任何一方都可以在线上进行通话。

从这里你有两个选择。

  1. 客户端连接并且永不断开连接(这是我实现的)。在服务器上,我有一个对象将客户端对象映射到客户端连接,因此我可以随时与已连接的客户端进行通信。

  2. Server为客户端保留一个消息队列。客户端以固定间隔自动连接以查看是否有任何消息(可能是5分钟)。服务器可以选择在特定时间间隔内保持连接。另一家供应商称之为“快速谈话”。

答案 1 :(得分:1)

有几种方法。

您可以设置NAT - 可能对您的方案没有好处。 您可以从客户端建立出站连接。

您可以通过使用STUN“结合上述内容”(参见http://en.wikipedia.org/wiki/STUN)这在VOIP中非常流行,用于点对点场景。

答案 2 :(得分:0)

Windows Azure servicebus可能会为您的问题提供解决方案;混合模式下的NetTcpRelayBinding允许NAT后面的两个计算机相互建立直接连接。如果由于每个连接都有相关的成本,这可能无法解决您的问题。

最简单的解决方案可能是让客户端轮询您的服务器。

答案 3 :(得分:0)

您可以使用SignalR,这是为此类情景开发的。

但是,您必须拥有第三方(从发件人向其他同行广播消息的服务器)。

但这项技术的优点在于它选择了最合适的方式将数据推送到客户端:轮询,长连接,套接字......等。

这提供了一个非常舒适的抽象层。

它旨在与javascript客户端进行交互,但也可以在完整的C#客户端中使用。

答案 4 :(得分:0)

您需要第三台服务器充当防火墙后面的计算机和目标计算机之间的代理。 这就是LogMeIn等应用程序的工作方式。 您可以使用SSH隧道执行此操作。

请检查https://serverfault.com/questions/285616/how-to-allow-remote-connections-from-non-localhost-clients-with-ssh-remote-port

答案 5 :(得分:0)

主题是关于NAT遍历。 STUN是尝试与NAT后面的客户端进行通信的不错选择。 但是,如果STUN不起作用,您可以使用RELAY服务来帮助在您的服务器和远程客户端之间传递消息.RELAY服务是一个公共服务,每个人都可以访问它。