P2P技術(shù) TCP打洞 內(nèi)網(wǎng)穿透
編程語(yǔ)言:C/C++ 主要使用:SOCKET套接字 編程軟件:VS2015 技術(shù)實(shí)現(xiàn):P2P?TCP打洞?內(nèi)網(wǎng)穿透實(shí)驗(yàn)
【1】服務(wù)器S:
1、監(jiān)聽(tīng)等待主機(jī)A和主機(jī)B連接.
2、服務(wù)器S將主機(jī)A和主機(jī)B對(duì)方的公網(wǎng)IP地址以及端口號(hào)告知對(duì)方(內(nèi)網(wǎng)IP地址也可以包含,因?yàn)榭赡苤鳈C(jī)在同一個(gè)NAT后面).
3、關(guān)閉連接
【2】主機(jī)A:
1、創(chuàng)建套接字1.
2、設(shè)置套接字1為SO_REUSEADDR重用標(biāo)記.
3、將套接字1綁定到一個(gè)指定端口號(hào),例如8888.
4、連接服務(wù)器S
5、等待服務(wù)器發(fā)送主機(jī)B的公網(wǎng)IP地址以及端口號(hào)
6、得到主機(jī)B的公網(wǎng)IP地址以及端口號(hào)之后,新建另外一個(gè)套接字2.
7、設(shè)置套接字2為SO_REUSEADDR重用標(biāo)記
8、將套接字2綁定到一個(gè)8888端口(第3步的端口號(hào)).
9、循環(huán)connect連接主機(jī)B.
【3】主機(jī)B:
與主機(jī)A的步驟完全一樣,當(dāng)2個(gè)人同時(shí)發(fā)起connect時(shí),connect返回0,這個(gè)套接字就是你們建立的鏈接.(不需要listen和accept)
【注意】
1、NAT類型不同,導(dǎo)致一些方法可能不管用,網(wǎng)上的很多一方connect(被NAT直接丟棄),對(duì)于我的NAT不管用.
2、還有一種先connect在對(duì)方NAT留下記錄,然后在讓對(duì)方connect,我方accept也不管用.