如何连接对等组

本主题讨论应用程序如何使用对等分组 API 连接到对等组。

加入对等组

若要加入对等组,请调用 PeerGroupJoin,传入对等方的标识名称以及邀请 (和可选的 PNRP 云名称(如果邀请中的云名称不明确) )。

如果成功, PeerGroupJoin 会将句柄返回到对等组。

如果对等之前已加入对等组,然后关闭句柄,则应通过调用 PeerGroupOpen 并传入对等组的名称重新打开对等组。 此调用返回新的对等组句柄。

成功加入对等组后,对等方可以直接连接到对等组,并通过调用 PeerGroupConnect 开始交互。 连接后,对等方被视为“联机”。

如果应用程序当时不会与组交互,则它可以保持“脱机”。 如果它选择直接参与稍后实例的对等组,则对 PeerGroupConnect 的后续调用将使它联机。 在对等组加入对等组后,它必须至少连接一次,然后才能将记录发布到对等组。

打开对等组而不连接脱机 ()

通常,你可能希望应用程序连接到对等组,但不直接参与它,接收和发布记录更新,但不发送或接收数据消息。 在调用 PeerGroupCreatePeerGroupJoinPeerGroupOpen 后,应用程序立即处于此“脱机”状态。

脱机应用程序可以随时通过调用 PeerGroupConnect 来联机。 连接后,对等组将无法脱机,直到与此标识关联的所有其他应用程序以及共享此组也已关闭与其建立连接。

对等组是共享资源,同一对等组可用于多个应用程序。 如果同一标识和Windows用户的多个应用程序使用相同的对等组,则它们也会共享同一基础数据库和连接, (邻居和直接) 。 如果其中任一应用程序调用 PeerGroupConnect,则参与该组的此标识/用户的其他所有应用程序也会连接到该组。 如果在组脱机时由一个应用程序添加记录,则其他应用程序也可以看到它。 因此,应用程序必须随时可供联机。

连接到对等组 (联机)

若要开始参与组,请创建、加入或打开组后调用 PeerGroupConnect 。 在此状态下,可以通过调用 PeerGroupOpenDirectConnection 与其他参与同一组的对等方打开直接连接。

若要检测连接尝试是否失败,请注册PEER_GROUP_EVENT_CONNECTION_FAILED事件。 如果分组基础结构找不到要连接到的另一个成员,或者在同步组数据库之前连接失败,并且无法建立另一个连接,则引发此事件。

尽管在对等方上执行且参与同一对等标识的同一组的多个应用程序可能处于脱机状态,但任何一个应用程序对 PeerGroupConnect 的调用会导致所有应用程序变为联机状态。

此外,如果对等方上的一个应用程序已连接到组,则调用 PeerGroupJoinPeerGroupOpen 的任何其他应用程序也立即连接。 如果应用程序调用 PeerGroupClose,则仅关闭该应用程序的句柄。 因此,应用程序对 PeerGroupOpen 的后续调用将返回新的组句柄,如果参与同一组的任何其他应用程序仍已连接,应用程序将立即联机。

发送和接收数据

若要在组中的特定成员节点之间发送和接收数据,必须与要与之交互的那些成员建立直接连接。 建立直接连接是对 PeerGroupOpenDirectConnection 的异步调用,传入连接的组的句柄以及要连接到的组中对等方的标识。 此方法将返回连接 ID。 如果调用成功,则对等方引发PEER_GROUP_EVENT_DIRECT_CONNECTION事件,验证连接 ID。

若要从其他联机对等方接收直接连接,请使用对 PeerGroupRegisterEvent 的调用注册PEER_GROUP_EVENT_DIRECT_CONNECTION事件。

成功建立直接连接后,应用程序就可以开始使用 对 PeerGroupSendData 的调用发送数据,从而传递有效的连接 ID。 多部分数据传输的排序由 PeerGroupSendData 处理。 但是,应用程序应实现适当的协议堆栈来处理此 API 调用返回的不透明数据。

若要通过直接连接接收数据,应用程序必须使用 PeerGroupRegisterEvent 注册PEER_GROUP_EVENT_INCOMING_DATA事件。 事件处理程序负责获取和排序不透明数据,并将其传递给应用程序。 通过将 PeerGroupGetEventData 与已注册事件的句柄一起调用 PeerGroupGetEventData ,在事件处理程序中获取此数据。

直接连接通过调用 PeerGroupCloseDirectConnection 并传入上一次对 PeerGroupOpenDirectConnection 获取的连接 ID,或在PEER_EVENT_GROUP_DIRECT_CONNECTION的事件数据中接收。