我正在尝试使用 mingw 工具链使用 Windows 套接字实现 TCP 打孔。我认为这个过程是正确的,但漏洞似乎并没有发生。我以此为参考。
- A和B连接到服务器S
- S发送给A , B的路由器 IP + 它用来连接S的端口
- S对B做同样的事情
- 一开始2个线程:
- 一个线程尝试使用S发送的信息连接到B的路由器
- 另一个线程在连接到S时正在等待连接到其路由器的同一端口上的传入连接
- B做同样的事情
我认为代码没有问题,因为:
- A和B确实让对方使用 ip 和 port
- 当他们联系服务器时,他们都在监听他们用来连接路由器的端口
- 它们都连接到正确的 ip 和端口,但超时(代码错误
10060
)
我错过了什么?
编辑:在流程资源管理器的帮助下,我看到其中一个客户端设法建立了与对等方的连接。但是对等体似乎没有考虑建立连接。
这是我用 Wireshark 捕获的。举例来说,服务器S和客户端A在同一台 PC 上。服务器S8060
侦听重定向到该 PC的特定端口 ( )。B仍然尝试在正确的 IP 上连接,因为它看到S发送的A的公共地址是,因此使用S的公共 IP 。(我已经用占位符替换了公共 IP)localhost
编辑2:我认为混淆是由于传入和传出连接请求数据都在同一个端口上传输。这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据。如果我引用 msdn:
SO_REUSEADDR
socket 选项允许一个套接字强制绑定到另一个套接字正在使用的端口。第二个套接字调用 setsockopt,其中 optname 参数设置为SO_REUSEADDR
, optval 参数设置为布尔值,TRUE
然后在与原始套接字相同的端口上调用 bind。一旦第二个套接字成功绑定,绑定到该端口的所有套接字的行为都是不确定的。
但是 TCP 打孔技术需要在同一个端口上通话才能打开孔!