【问题标题】:Avoiding simultaneous bi-directional connections in a P2P network architecture [closed]在 P2P 网络架构中避免同时进行双向连接 [关闭]
【发布时间】:2019-03-15 17:01:57
【问题描述】:

好吧,我是一名合格的程序员,多年来一直在做各种奇迹,但我终于要针对一个我完全无法解决的问题提出一个问题。我希望 Stack Overflow 能在这么多年后再次挽救我的生命。


这是关于唯一对问题。我正在使用 GIO 的 GSocketClientGSocketService 高级 API 来建立异步连接并接受两个对等方之间的传入连接(显然每个都使用相同的程序)。由于对等点可以同时相互连接,因此这会导致 2 个连接,而只需要一个。

我尝试了太多的事情,包括删除绑定 IP 号在另一个之前的连接(这样一个连接被丢弃),但这仍然不总是有效,所以我现在头晕目眩,应该先到哪里,先到哪里。

为了不让我尝试过的所有 b******t 过于复杂,我将直截了当地问:在这种情况下,正确的方法是什么?

【问题讨论】:

  • 1.如果您可以找到哪个 IP 在另一个之前,您为什么不尝试在创建第二个之前检查现有连接是否已建立? 2. 为什么断开连接不起作用?
  • @adrtam 连接可能随时出现,随时可以处理,这就是异步本质的本质。我将 IP 转换为一个数字,如果这是该 IP 第二次想要存在于连接列表中,我会尝试删除更高的数字。但是peer是先connect还是先accept是不可预知的,我真的不知道。
  • 我认为,如果您希望人们认真对待您,您可能需要在介绍时使用语气。
  • @SergeyA 这是什么意思?
  • 我的意思就是我所说的。 “经过认证的程序员多年来一直在创造奇迹,这听起来有点自命不凡。

标签: c sockets networking p2p gio


【解决方案1】:

这很艰难,但经过 3 天的坚持思考和测试……我有一个解决方案。

我坚信这个问题不应该被否决(尤其是因为它看起来“自命不凡”),但我们不能总是充分利用 S/O。

问题

当两个对等方想要同时相互连接时 将有两个连接,而只需要一个。 在接受、连接和处理时更加复杂 是异步的,可以随时发生,也可以同时发生 对等点分别使用相同的程序,因此是相当严格的 P2P 架构。 这是拜占庭将军问题的一个经典例子,它是最难的计算机问题之一。

解决方案

该解决方案不涉及完全同步,因此它缺少异步连接、接受和处理的要点,并且在处理后不需要断开连接。这个有效的解决方案背后有 3 个主要思想。

  1. 某种记录(我使用GList)包含“待定”IP
  2. 将 IP 转换为数字的功能
  3. 系统等待并授予权限

如果正确实施并在正确的地方使用,您就拥有了。现在更详细一点。

某种包含“待定”IP 的记录

正如我所说,这可以是一个列表。追加、搜索和删除操作必须由互斥锁锁定。从列表中删除 IP 必须在接受、搜索后和断开连接通知程序中发生。

将IP转换为数字的功能

例如rScanf = sscanf(ip, "%u.%u.%u.%u", &bytes[0], &bytes[1], &bytes[2], &bytes[3]);

然后添加每个数字。这被用作排他标准。 if(remote_ip_number > local_ip_number) 将只对其中一个同行有效。

系统等待并授予权限

连接必须等待接受线程的许可。尽管调用必须是阻塞的,但它不会造成任何开销,在大多数情况下它会立即返回。 之后,如果它收到许可(拒绝(1)或授予(2)),它会发送 ACK(3)并返回(1-断开连接)或继续。主机等待 ACK,然后以同样的方式返回(断开连接)或继续(如果授予权限)。

主机应根据排他标准确定是拒绝还是授予。 首先,它检查 IP 是否存在于挂起的连接列表中(基本上意味着程序也尝试连接),如果存在,则 IP 条件是否匹配发送授权或拒绝。


在 connect 的同步调用早期,在它实际尝试连接之前,将 IP 添加到待处理连接列表中很重要,而且程序的构造方式也很重要,即它首先连接到无论它想连接谁,然后托管,以便注册第一个待处理的 IP。这在可预测性方面略有优势。

connect(PETER); /* adds PETER ip to listPending */
connect(JOHN); /* adds JOHN ip to listPending */

host(ME); /* Gives permission if IP does not exist in listPending or it does but local ip number < remote ip number */

【讨论】:

    猜你喜欢
    • 2017-12-04
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多