我想知道可以用C#或Java中继套接字对象吗? (最好是C#)
我制作了很多小程序并将它们托管在我的家用电脑上,但我的电脑是在路由器后面,所以每次我想要制作一个新的应用程序时,我必须在我的路由器上转发一个端口。那么有没有办法将tcp连接发送到同一台计算机上的另一个应用程序?例如,我得到一个连接,第一行文本为RELAY::21005
,然后将该端口转发到localhost:21005
?
任何帮助,教程,代码片段都将非常感谢。谢谢! :)
答案 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库/应用程序: