C 如何绕过与已连接的一方的连接

C 如何绕过与已连接的一方的连接,c,sockets,asynchronous,networking,connection,C,Sockets,Asynchronous,Networking,Connection,我面临着困难,无法确定如何根据我的程序体系结构从双方取消同步连接。这是一个P2P聊天。当程序启动时,各方将自动相互连接。连接过程是异步的。 当有传入连接时,从侦听器调用一个信号,信号处理程序负责连接。所以“接受”也是异步的 这将最终连接两个用户两次。将有两个连接。 双方将是服务器和客户端。这是不需要的。 现在我尝试了很多方法来解决这个问题,但是没有一个真正起作用。 例如,我在侦听器信号处理程序中检查该IP上是否已经存在套接字,如果已经存在,则断开连接并返回。但是连接的设计方式是另一方将继续尝试连

我面临着困难,无法确定如何根据我的程序体系结构从双方取消同步连接。这是一个P2P聊天。当程序启动时,各方将自动相互连接。连接过程是异步的。 当有传入连接时,从侦听器调用一个信号,信号处理程序负责连接。所以“接受”也是异步的

这将最终连接两个用户两次。将有两个连接。 双方将是服务器和客户端。这是不需要的。 现在我尝试了很多方法来解决这个问题,但是没有一个真正起作用。 例如,我在侦听器信号处理程序中检查该IP上是否已经存在套接字,如果已经存在,则断开连接并返回。但是连接的设计方式是另一方将继续尝试连接


什么是正确的设计方法?有哪些替代方案?

让我们看看四个对等点的情况:

如果每个对等点连接到其他对等点,则每对对等点之间将有两个连接。(如果存在N个对等点,则存在N(N-1)/2个唯一对。)

在上图中,对等点按其名称(A、B、C、D)排序。与字母表后面的名称相同的对等点的连接为蓝色,与字母表前面的对等点的连接为红色

如果您能够以某种方式对对等点进行排序,则仅在顺序中连接到自己之前的对等点(红色),并在自己之后接受来自对等点的连接(同样,红色),将确保每个唯一对等点对只有一个连接

假设您有
N个
对等点,并且您以某种方式将它们从
0
排序到
N-1
,包括在内。然后,对等方
i
需要
accept()
N-1-i
对等方的连接,以及
connect()
i
对等方的连接

当然,实践中没有什么比这更简单的了。问题是同龄人可能在不同的时间出现,而不是同时出现;如果另一端没有与地址和端口对应的侦听套接字,则连接将失败。因此,最重要的是首先创建侦听套接字,确保积压足够大,然后创建连接

如果我们看看s(因为OP使用的似乎是s),那么解决方案相当简单,假设所有对等方都同意他们的顺序

  • 所有对等方都使用
    g\u socket\u new()
    g\u socket\u bind()
    g\u set\u backlog()
    g\u socket\u listen()
    创建侦听套接字。积压工作应该至少是对等的数量(少一个)

    如果可以在运行时“邀请”新的对等点,则使用更大的积压工作。如果无法邀请新的对等方加入,则顺序中的最后一个对等方不需要侦听套接字,因为它将只进行连接,而不接受传入的连接

  • i
    th peer(顺序中的第一个peer是
    0
    )创建
    i
    套接字以连接到排序中之前的对等方,使用
    g_socket\u new()
    、可选
    g_socket\u bind()
    、可选
    g_socket\u set\u blocking()
    使连接非阻塞,以及
    g_socket\u connect())

    如果使用
    g\u socket\u set\u blocking()

    请注意,由于每个对等方创建其传入套接字的时间存在实际差异,因此连接可能会失败(因为另一端尚未启动)。在这些情况下,您只需重试;i、 e.再次调用g_socket_connect()

    (您还可以使用
    g_socket\u create_source()
    从套接字创建
    GSource
    ,将其视为事件源。)

  • 此时,传入连接应该在操作系统网络堆栈中积压(或将积压),因此对等
    i
    应该使用
    g\u socket\u accept()
    在排序中接受来自
    N-1-i
    对等方的传入连接


  • 就我个人而言,我会使用不同的体系结构/方法,动态管理对等列表

    假设每个对等点都有一个唯一的标识符。(例如,可以是IPv6映射的地址和端口,也可以是用户昵称及其公钥。)

    当建立连接时,连接方发送一个初始握手,其中包含其自己的标识符和它试图连接的一方的标识符。当接受新连接时,会收到初始握手(在某个超时间隔内)。如果连接方是新的连接方,则会将其添加到“连接的对等方”列表中。如果已连接,则新连接或现有连接将断开(在发送一个说明断开原因的数据包后)


    这还允许“邀请”和跨网格共享对等连接信息。

    让我们看看四个对等的情况:

    如果每个对等点连接到其他对等点,则每对对等点之间将有两个连接。(如果存在N个对等点,则存在N(N-1)/2个唯一对。)

    在上图中,对等点按其名称(A、B、C、D)排序。与字母表后面的名称相同的对等点的连接为蓝色,与字母表前面的对等点的连接为红色

    如果您能够以某种方式对对等点进行排序,则仅在顺序中连接到自己之前的对等点(红色),并在自己之后接受来自对等点的连接(同样,红色),将确保每个唯一对等点对只有一个连接

    假设您有
    N个
    对等点,并且您以某种方式将它们从
    0
    排序到
    N-1
    ,包括在内。然后,对等
    i
    需要
    accept()
    来自
    N-1-i
    对等的连接,并且