关于tcp中转,或者叫打洞.又或者叫被动穿透?搞不懂..内详

wasg 2015-06-10 04:56:58
最近需要实现一个功能,其实我也不知道应该叫啥.
主要功能是这样.
在公网有一台服务器S,在一个内网里有一个服务器A,然后第二个内网里有个客户端C.
在A上有个WEB SERVER,我希望客户端C通过访问服务器S的时候,S可以中转A上的WEB SERVER内容给C,
我试过写代码,
在S上listen一个端口(例如999),A主动和S的999端口建立一次TCP连接,S新listen一个端口(例如1199),发回去给A,然后A再建立一次连接到新listen的这个1199端口,随便发点信息然后断开,S记录下A的外网IP和端口并listen一个新端口(例如1120),然后close掉1199。每当C访问S的1120端口的时候,S就先bind一下1199端口到新建的连接,然后通过记录下来的A的公网IP端口和A建立连接,但是我却发现这一步没办法连接成功。看了一些内网穿透的资料,大概原理就是这样,我也很奇怪。。
A(1.1.1.1:9999)->S(999)
S开新端口1199->发送回A
A(1.1.1.1:9998)->S(1199)
S(1999)记录A信息并再开端口1200
C->S(1200)->S(0.0.0.0:1199)->A(1.1.1.1:9999)这一步没办法建立连接。

难道TCP打洞不是这么 的吗。。后来我又想了另外一种方式.但这种是不是叫被动连接?

A(1.1.1.1:9999)->S(999)
S开新端口1199并记录A的信息,但不断开A的连接
C->S(1199)->S通过刚建立的A的连接直接send数据给A,A返回的信息也直接发回C

但这样又遇到一个问题.。那当有多个客户端连接1199端口的时候,怎么知道A返回的信息属于哪个客户端.

希望大家可以指正我的错误,或者给我提供可行的方案.。非常感谢.
...全文
1559 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧