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