2024年5月9日发(作者:)

哪位朋友搞过P2P的能说说怎么实现ClientA要求Server发送信息给ClientB向

ClientA打洞?

原理大体知道点:

想实现ClientA与B通信,必须让Server通知ClientB向ClientA打洞,因为ClientA

直接向B发送信息,出于安全考虑会被禁止的,所以在A向B通信之前,必须让B发送信

息给A......

但是我不明白ClientB发送信息给A不一样会被A给禁止么?

你好,实现过程如下:

服务器端Server启动两个网络侦听。

客户端CilentA和客户端CilentB分别与服务器端Server保持联系。

当CilentA需要和CilentB建立直接的TCP连接时,首先连接服务器端Server的打

洞端口,并发送协助连接申请。同时在该端口号上启动侦听。

SERVER连接收到CilentA的申请后通知CilentB,并将CilentA经过公网IP地址和

端口等信息告诉CilentB。

CilentB收到服务器端Server的连接通知后首先与Server的打洞端口连接,随便发

送一些数据后立即断开,这样做的目的是让服务器Server能知道CilentB的公网IP和端

口号。

CilentB尝试与CilentA的公网IP地址和端口进行connect

客户端B打洞的同时在相同的端口上启动侦听。CilentB在一切准备就绪以后通过与

服务器Server在收到以后将CilentB的公网IP和端口号告诉给CilentA。

CilentA收到服务器Server回复的CilentB的公网IP和端口号等信息以后,开始连接

到CilentB公网IP和端口号,从而直接的TCP连接建立起来了。

// 服务器SERVER地址和端口号定义

#define SRV_TCP_MAIN_PORT 4000 // 服务器主连接的端口号

#define SRV_TCP_HOLE_PORT 8000 // 服务器响应客户端打洞申请

的端口号

这两个端口是固定的,服务器Server启动时就开始侦听这两个端口了。

//

// 将新客户端登录信息发送给所有已登录的客户端,但不发送给自己

//

BOOL SendNewUserLoginNotifyToAll ( LPCTSTR lpszClientIP, UINT nClientP