Ruby socket 如何突破 NAT 和 Firewall 实现两台计算机通信

realwol · 2013年05月13日 · 最后由 zthua 回复于 2013年06月14日 · 4864 次阅读

小弟接触 ruby 时间不长,简单做了个 server 和 client,然后发现通过 ubuntu 和 window 间命令行下使用 socket 通信会简单而快速的返回服务器拒绝通信。在都是 windows 情况下,client 在尝试一段时间后会返回服务器无响应之类的信息然后中断,期间 server 一直处于等待接收状态。查了查发现说是 NAT 和 firewall 的问题吧,小弟网络方面知识相当鄙陋,希望能得到各位的指导,能顺利做出相当于 qq 这样的简易聊天工具。

貌似不需要这么麻烦。 配一台都能连上的服务器做中转就好了。

NAT 就是这样的... 只能 connect 不能 bind (一边连另一边可以,但反过来不行)

如果是自己实现的传输层协议就可以做到双向通信

举个例子,旧的 http 协议只能客户端访问服务器,不能服务器推送到客户端,因为 http 连接也是只有 connect 没有 bind, 所以就有用客户端轮询的方式实现 (每隔一段时间访问一下服务器,看看有什么新东西要推送过来), 然后在这个实现的基础上包装一个双向通信的框架,就是自实现的传输层协议了。

#1 楼 @hhuai 我就自己两台电脑做个简单链接,一个做 s 一个做 c,可是还是达不到在同一台机子上的那种效果,就想找找问题再哪儿,做中转的话,那么作为中转的机子不是也得联通上两台自己么

#2 楼 @luikore 久闻大名,终得一回复,感激涕零。

搜索:UDP 打洞和 STUN

#2 楼 @luikore 那像 qq 这样的软件,是如何来客服通信间遇到的问题的。

#5 楼 @SharpX 刚刚在看 tcp 打洞,发现这个说的是两个私网客户机通过公网 server 通信,基础是起码私网客户机和 server 能通信的基础上;而我的问题是 server 和客户机的链接都不通。

#7 楼 @realwol qq 各种手段都有吧,你是在本地的虚拟机上弄还是局域网弄?

#8 楼 @luikore 局域网,两台机子。

#9 楼 @realwol 用局域网 ip 连接可以么?server 在哪头 client 在哪头?简单的 echo hello world 可以跑么?linux 用的端口超过 2000 么?

#10 楼 @luikore 用的 ip 直接链接,现在两个都在 windwos 下,server 是 xp,client 是 win7,端口 2200。我关了 xp 上的 firewall,可以从 win7 上 ping 到;可是关了 win7 firewall,从 xp 上 ping 不到,而且我 xp 上是允许 ping 出的。

#11 楼 @realwol ... 这个算不算操作系统相关问题

win 7 的 server 服务打开了么?(计算机管理 -> 服务里找) 试试开 admin 控制台 (好像是 shift 点 cmd.exe 开的忘记了) 跑程序。

#12 楼 @luikore server 开了。。。记得大学时候在舍友机子上用 c 做聊天程序,当时关了防火墙就可以,现在这还不行,不得不服老啊。

XMPP Link-Local

#13 楼 @realwol 那就不知道了... 不能都在 linux 下搞么...

#14 楼 @linjunhalida 恩,果然好办法,内容清晰,解释到位,可是。。。小弟没看懂。

@realwol 关键词都给了,其他的都 google。。。

#16 楼 @luikore 就准备 win7 机子上再做个 ubuntu 试试。不过,应该有办法解决的,我再查查。

#15 楼 @bhuztez 这就是那个局域网聊天的东西?十个月前,你在有个要在 ubuntu 里用 qq 的人的帖子里回的。。。我不了解这个东西啊

#18 楼 @linjunhalida 这个是通过跳板来实现内网访问吧。可是我的问题是 s-c 链接都有问题,谈不上跳板吧。莫非是用同样的原理实现通信?

@realwol s-c 链接有问题的话估计要用 wireshark 抓一下包,看看包出现什么问题了,你可以本地先测试一下,保证 s-c 本身是没有问题的。

我也遇到过这个问题,使用 TCPServer 时,服务器端放在 XP 的机子上,其它机器客户端能连上,但是服务器端放在 win7 机器上,客户端就连不上,这个是怎么回事?win7 的 server 服务我已经开启了,郁闷啊

需要 登录 后方可回复, 如果你还没有账号请 注册新账号