哪位朋友搞过P2P 的能说说怎么实现ClientA 要求Serv er 发送信息给ClientB 向ClientA 打洞? 原理大体知道点: 想实现ClientA 与B 通信,必须让Serv er 通知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 nClientPort, DWORD dwID ) { ASSERT ( lpszClientIP && nClientPort > 0 ); g_CSFor_PtrAry_SockClient.Lock(); for ( int i=0; im_bMainConn && pSockClient->m_dwID > 0 && pSockClient->m_dwID != dwID ) { if ( !pSockClient->SendNewUserLoginNotify ( lpszClientIP, nClientPort, dwID ) ) { g_CSFor_PtrAry_SockClient.Unlock(); return FALSE; } } } g_CSFor_PtrAry_SockCl...