C# 有没有可能';继电器';插座?

C# 有没有可能';继电器';插座?,c#,java,.net,sockets,networking,C#,Java,.net,Sockets,Networking,我想知道是否可以在C#或Java中中继套接字对象?(最好是C#) 我有很多我制作的小程序,并把它们放在我的家用电脑上,但是我的电脑在路由器后面,所以每次我想制作一个新的应用程序时,我都必须在路由器上转发一个端口。那么,有没有一种方法可以将tcp连接发送到同一台计算机上的另一个应用程序?例如,我在中获得了一个连接,第一行文本是RELAY::21005,然后将该端口转发到localhost:21005 任何帮助、教程、代码片段都将不胜感激。谢谢!:) K我收回我的评论,看看这个: 使用此服务需要端

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

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


任何帮助、教程、代码片段都将不胜感激。谢谢!:)

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

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

Net.TCP端口共享服务在所有操作系统上都可用 它支持.NET Framework 3.0,但该服务不是由 默认


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

K我收回我的评论,请查看以下内容:

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

Net.TCP端口共享服务在所有操作系统上都可用 它支持.NET Framework 3.0,但该服务不是由 默认


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

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

但是假设你想编一些程序

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

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


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

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

但是假设你想编一些程序

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

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


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

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

我建议您的路由服务器侦听两个端口—一个控制端口和一个“普通”端口(目前我想不出更好的名称)。您将向控制端口发送控制消息,以指示“在进一步通知之前,将正常端口上的所有传入连接重定向到端口nnnn”。这避免了操作客户端协议

我对C#了解不够,无法提供有关C#解决方案的建议,但在Java中,我只想做如下事情:

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

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

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

我建议您的路由服务器侦听两个端口—一个控制端口和一个“普通”端口(目前我想不出更好的名称)。您将向控制端口发送控制消息,以指示“在进一步通知之前,将正常端口上的所有传入连接重定向到端口nnnn”。这避免了操作客户端协议

我对C#了解不够,无法提供有关C#解决方案的建议,但在Java中,我只想做如下事情:

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

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

是的,可以中继一个插座。 你可以使用TURN

有些程序库/应用程序:

  • pjnath
  • turnserver.sourceforge.net

是的,可以中继插座。 你可以使用TURN

有些程序库/应用程序:

  • pjnath
  • turnserver.sourceforge.net

不确定是否需要外部程序来告诉计算机要打开哪些端口。但您描述的是一种代理服务,所以您可能需要挖掘一些简单的开源代理项目,看看它们是如何转发数据的。这也是ssh隧道的意义所在,因此您可以使用它。ssh隧道如何允许共享端口?@sixfeetsix-the
-L
-R
选项在一台机器上打开侦听端口,并将连接转发到另一台机器上的端口