有没有可能'继电器'一个套接字

本文关键字:套接字 一个 继电器 有可能 | 更新日期: 2023-09-27 18:02:18

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

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

任何帮助,教程,代码片段将非常感激。谢谢你!:)

有没有可能'继电器'一个套接字

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

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

我对c#的了解不够,无法提供有关c#解决方案的建议,但在Java中,我会简单地做这样的事情:

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

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

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

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

。TCP端口共享服务适用于所有操作系统支持。net Framework 3.0,但该服务不支持违约。

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

但是假设你想要编程…

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

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

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

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

部分TURN库/应用程序:

  • pjnath
  • turnserver.sourceforge.net