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

时间:2011-07-15 17:43:52

标签: c# java .net sockets networking

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

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

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

5 个答案:

答案 0 :(得分:1)

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

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

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

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

你无法轻易地将其扩展到成千上万的连接......

答案 1 :(得分:0)

K我收回了我的评论,请查看:

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

使用此端口共享服务to be up(默认情况下禁用):

  

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

如果您使用的是WCF服务,所有这些只对您有用。

答案 2 :(得分:0)

可能想查看这个旧的收藏:netcat

答案 3 :(得分:0)

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

但假设您想要编程......

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

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

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

答案 4 :(得分:0)

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

某些TURN库/应用程序:

  • pjnath
  • turnserver.sourceforge.net