【发布时间】:2012-02-07 19:11:50
【问题描述】:
我正在尝试使用 mingw 工具链通过 Windows 套接字实现 TCP 打孔。我认为这个过程是正确的,但 hole 似乎没有采取。我使用this 作为参考。
- A 和 B 连接到服务器 S
- S 发送到 A,B 的路由器 IP + 它用来连接 S 的端口
- S 对 B 执行相同的操作
-
A 启动 2 个线程:
- 一个线程尝试使用 S 发送的信息连接到 B 的路由器
- 另一个线程在连接到 S 时,正在等待连接到其路由器的同一端口上的传入连接
- B 也是如此
我认为代码没有问题,因为:
- A 和 B 确实可以让对方使用 ip 和端口
- 他们在联系服务器时都在监听用于连接路由器的端口
- 它们都连接到正确的 ip 和端口,但超时(代码错误
10060)
我错过了什么?
编辑:在流程浏览器的帮助下,我看到其中一个客户端设法建立了与对等方的连接。但是对端似乎没有考虑要建立的连接。
这是我使用 Wireshark 捕获的内容。举例来说,服务器 S 和客户端 A 在同一台 PC 上。服务器 S 侦听重定向到该 PC 的特定端口 (8060)。 B 仍然尝试连接正确的 IP,因为它看到 S 发送的 A 的公共地址是 localhost,因此使用S 的公共 IP。 (我已经用占位符替换了公共 IP)
EDIT 2:我认为混淆是由于传入和传出的连接请求数据都在同一个端口上传输。这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据。如果我引用 msdn:
SO_REUSEADDR套接字选项允许套接字强制绑定到 另一个套接字正在使用的端口。第二个套接字调用 setsockopt 与 optname 参数设置为SO_REUSEADDR和 optval 参数设置 到布尔值TRUE,然后在与 原装插座。 一旦第二个套接字成功绑定, 绑定到该端口的所有套接字的行为是不确定的。
但是 TCP 打孔技术需要在同一个端口上进行通信才能打开漏洞!
【问题讨论】:
-
那么您的 TCP 打孔解决方案是什么?我对此很感兴趣。
-
你能解决这个问题并进行 TCP 打孔吗?
-
@pkrish 我只设法启动了同时 TCP 打开(请参阅所选答案的评论)
-
@Ginn 你有任何代码来说明你的工作吗?我试过用 Python 写一些,但我不知道是我的代码不起作用还是我试图通过的防火墙不喜欢所需的 SYN/SYN/ACK/ACK 序列。
-
@Ginn 啊,真丢人。我wrote one,它似乎工作得很好。
标签: windows tcp network-protocols winsock2 hole-punching