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
发布评论