关于内网穿透(NAT打洞)的两个小问题

木落 2011-12-19 09:54:17
首先,这么做是为了让内网的机子之间共享数据。
我们知道打好洞以后是这样:

ClientA -----> Server <--------- Client B

Client A和B分别来自两个内网,Server在外网
然后服务器进行一系列操作完成了通信。
那么问题来了:

1. 这样做的话相当于做了一个代理,岂不是要占用大量的服务器资源?那QQ神马的传文件不都杯具了?

2. 你看我们打了一个洞,也就是建立了一个socket通道……那么所有的连接都要通过1个socket连接来干吗?因为connect要求有IP,server连接不到ClientB,那么如果A跟Server建立了多个通道,那Server如何跑去和B建立多个通道呢?
...全文
496 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shengxiaruoxi 2011-12-22
  • 打赏
  • 举报
回复
你需要了解路由器NAT原理,
clientA连接外网会在路由器上开一个端口,例如 192.168.1.2(80) 在路由器上就有一个 映射 路由外网IP:12.12.13.13(8899) 外网的某台主机网 12.12.13.13(8899) 上发送信息 就会 转发到192.168.1.2(80)

当然这个映射一定时间内没数据是会超时的。。

threewall 2011-12-22
  • 打赏
  • 举报
回复
打洞的目的就是绕过server而直接使两个client互相通信。
具体说主要是因为局域网主机在路由器重新映射了端口,打洞的目的就是使两个client路由映射后的端口可以互相访问。
网上可以下载到例子程序,如果你需要,我也可以发给你。
木落 2011-12-22
  • 打赏
  • 举报
回复
留个邮箱 fy0@qq.com
木落 2011-12-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 threewall 的回复:]

打洞的目的就是绕过server而直接使两个client互相通信。
具体说主要是因为局域网主机在路由器重新映射了端口,打洞的目的就是使两个client路由映射后的端口可以互相访问。
网上可以下载到例子程序,如果你需要,我也可以发给你。
[/Quote]

感谢楼上几位,大概是弄明白了
原来外部服务器只是一个中间人的作用,
后来进行数据通信真正依靠的是NAT设备(可以视为一种类似协议的东西,我们默认它存在)。

源代码下了几个,可惜都是VC实现,实在是太不直观了 =.=
人家的代码里淡定的调用了CSocket.Detach()然后将返回值指定为进行连接的套接字,换个端口直接就反向了……然后我看到这里直接进入2B状态

有没有Winsock版本实现,或者是linux版本实现的代码呢?
youkuxiaobin 2011-12-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/yxz149/article/details/1517269
打上洞之后就没有Server的事情了
因为NAT设备已经记录了(类似路由表)
直接发送数据就可以了

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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