是否可以“中继”套接字?

我想知道可以用C#或Java中继套接字对象吗? (最好是C#)

我有很多小程序,并在我的家用电脑上托管它们,但我的电脑是在路由器后面,所以每次我想要制作一个新的应用程序时,我必须在我的路由器上转发一个端口。 那么有没有办法将tcp连接发送到同一台计算机上的另一个应用程序? 例如,我得到一个连接,第一行文本是RELAY::21005 ,然后将该端口转发到localhost:21005

任何帮助,教程,代码片段将不胜感激。 谢谢! 🙂

您建议的解决方案可能遇到的一个问题(第一行标识目标端口)是您必须更改所有客户端程序以发送第一行。 这对你自己编写的程序来说很容易,但如果你想连接到你的PC的网络服务器或ssh守护进程等那么就不那么方便。当然,这并不是不可能的,但确实让它变得困难。

我建议你的路由服务器监听两个端口 – 一个控制端口和一个“普通”端口(我现在想不出更好的名字)。 您将控制消息发送到控制端口以指示“直到进一步通知将正常端口上的所有传入连接重定向到端口nnnn”。 这避免了必须操纵客户端协议。

我不太了解C#提供有关C#解决方案的建议,但在Java中我只是做了类似的事情:

 while (true) { acceptConnectionOnNormalPort() connectToTargetPort() startThreadCopyingDataFromAcceptedPortToTargetPort() startThreadCopyingDataFromTargetPortToAcceptedPort() } 

您无法轻松扩展到数千个连接……

可能想看看这个旧的最爱: netcat

KI收回我的评论,看看这个:

http://msdn.microsoft.com/en-us/library/aa395195.aspx

使用此端口共享服务需要启动 (默认情况下禁用):

Net.TCP端口共享服务适用于支持.NET Framework 3.0的所有操作系统,但默认情况下不启用该服务。

所有这些只有在您使用WCF服务时才对您有用。

IMO最简单的方法是使用ssh隧道。 正如我在评论中写的那样,SU上有很多问题会告诉你如何做到这一点。

但假设你想要编程……

您需要创建客户端和服务器。 客户端将具有在您要打开的任何本地端口上调用accept线程。 当连接到达端口时,您创建另一个线程,该线程打开与服务器的连接并通过线路不断发送数据。

服务器程序侦听您在防火墙中打开的单个端口。 它等待该端口上的连接,当它收到一个端口时,它会打开与指定本地端口的连接。 然后它将字节从一个字节移动到另一个字节。

唯一的技巧是您必须定义用于在客户端 – 服务器流中指定目标端口的协议。 最简单的方法是在流的开头写一个双字节整数。

是的,可以中继套接字。 您可以使用TURN http://en.wikipedia.org/wiki/Traversal_Using_Relay_NAT

一些TURN库/应用程序:

  • pjnath
  • turnserver.sourceforge.net