服务器: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。
试一下这个步骤看看行不行。