当前位置: 代码迷 >> VC/MFC >> TCP打洞如何都打不通,求
  详细解决方案

TCP打洞如何都打不通,求

热度:234   发布时间:2016-05-02 03:22:52.0
TCP打洞怎么都打不通,求高手指点
本帖最后由 wxliangzyt 于 2015-05-10 16:35:02 编辑
服务器:S
客户端A(连接S后,外网端口为:60000,同时开一个SOCKET侦听此端口)   客户端B(连接S后,外网端口为:40000,同时开一个SOCKET侦听此端口)   
S分别把对方的端口与外网IP发给对方

A,B,收到对方的外网IP和端口后,便每隔3分钟打一次洞(我是用:ConnectEx(m_TestClient_ConnectSocket,(SOCKADDR*)&g_service,sizeof(SOCKADDR),NULL,0,&m_dwTrasBytes,&lpOLConnectEx->m_OLap))来连接实现打洞
我理解就打洞就是实现一次连接


此方法一个洞都打不通,我想应该是我打洞的方式错了,求指点


A,B网络都是ADSL,具有动态的独立IP,路由器开通DMZ就可直连的

setsockopt(pcs->m_ServerSocket,SOL_SOCKET ,SO_REUSEADDR,(char*)&iOption_value,iLength);

设置了重用的
------解决思路----------------------
要实现所谓的打洞技术,需要写一个服务器这个服务器运行在公网上。设计一个客户端登陆协议比如用户ID号,服务器可以登记客户端在服务器的登陆IP地址和端口号(TCP/UDP协议连接到公网的时候最终在连接上服务器上的SOCKET上表示出来)。
A登陆到运行在公网的服务程序,服务程序通过A连接时的SOCKET记录下A在公网上的IP和端口号。
B登陆到运行在公网的服务程序,服务程序通过B连接时的SOCKET记录下B在公网上的IP和端口号。
然后服务程序把A登陆的IP和端口号告诉B,把B的登陆IP和端口号告诉A。
A断开用客户端身份与服务程序的连接,使用这个端口号建立服务器。
B断开用客户端身份与服务程序的连接,使用这个端口号建立服务器。
A用这个端口号做服务器。B要找A时就以客户端方式连接到A。
B用这个端口号做服务器,A要找B时就以客户端方式连接到B。
试一下这个步骤看看行不行。
  相关解决方案