gpt4 book ai didi

zeromq - ZeroMQ 内部是如何连接和绑定(bind)工作的

转载 作者:行者123 更新时间:2023-12-02 21:15:37 27 4
gpt4 key购买 nike

我正在试验 ZeroMQ。我发现在 ZeroMQ 中非常有趣,connectbind 先发生并不重要。我试着查看 ZeroMQ 的源代码,但它太大了,找不到任何东西。

代码如下。

# client side
import zmq
ctx = zmq.Context()
socket = ctx.socket(zmq.PAIR)
socket.connect('tcp://*:2345') # line [1]
# make it wait here

# server side
import zmq
ctx = zmq.Context()
socket = ctx.socket(zmq.PAIR)
socket.bind('tcp://localhost:2345')
# make it wait here

如果我先启动客户端,服务器还没有启动,但神奇的是代码没有被阻塞在第 [1] 行。此时,我检查了 ss 并确保客户端没有在任何端口上监听。它也没有任何开放的连接。然后我启动服务器。现在服务器正在监听端口 2345,客户端神奇地连接到了它。我的问题是客户端如何知道服务器现在在线?

最佳答案

最好的提问地点是 ZMQ mailing list ,因为该库的许多开发人员(和创始人!)都活跃在那里,可以直接回答您的问题,但我会试一试。我承认我不是 C 开发人员,所以我对源代码的理解是有限的,但这是我收集的,主要来自 src/tcp_connector.cpp (其他传输包含在各自的文件中,可能表现不同)。

Line 214启动 open() 方法,这里看起来是正在发生的事情的核心。

要回答关于代码为何未在行 [1] 处被阻止的问题,请参阅 line 258 .它专门调用一种方法使套接字行为异步(有关 unblock_socket() 工作原理的细节,您必须与更精通 C 的人交谈,它定义为 here)。

关于 line 278 ,它会尝试与远程对等方建立连接。如果它立即成功,那么你很好,绑定(bind)的套接字就在那里,我们已经连接了。如果不是,在 line 294它将错误代码设置为 EINPROGRESS 并失败。

为了看看接下来会发生什么,我们回到 start_connecting() method on line 161 .这是调用 open() 方法的地方,也是使用 EINPROGRESS 错误的地方。我对这里发生的事情的最好理解是,如果一开始它没有成功,它会异步地再次尝试,直到找到它的对等点。

关于zeromq - ZeroMQ 内部是如何连接和绑定(bind)工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30883859/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com