我可以在不破坏套接字的情况下将 ZeroMQ 套接字重新绑定到不同的端口吗?

Can I rebind a ZeroMQ socket to a different port without destroying the socket?

我有一个请求-回复模式的回复 ZSocket。

稍后,我想切换绑定,因此回复套接字现在响应不同端口上的请求。用户输入他们想要监听的端口,如果他们不想在默认端口 5555 上监听。

我可以通过简单地再次调用 ZSocket.Bind() 来做到这一点,还是我必须先销毁套接字对象。

如果我必须先销毁它,那么我如何确定 ZSocket 现在已经准备好反弹到其他东西?我知道关闭套接字在 C 中的处理方式不同,因为它没有垃圾收集。由于 ZeroMQ 的 C# 语言绑定可以使用垃圾收集,是否只是关闭套接字并在另一个端口上创建一个新套接字一样简单?我需要为设置较低的 Linger 值或类似设置而烦恼吗?

我在文档中找不到任何相关信息。 这是一个相关的问题ZeroMQ: Address in use error when re-binding socket

这是我的代码

private ZContext context = new ZContext();
private ZSocket replier = new ZSocket(context, ZSocketType.REP);
replier.Bind("tcp://*:5555); //bind to default port
//yada yada...
//user enters new port to listen on 5556
replier.Bind("tcp://*:5556);

正确的做法是什么?请解释答案背后的逻辑。

我不确定 C# 绑定,但您可以使用纯 C api 重新绑定 zmq 套接字并立即开始在新端口上接收消息。滞留期与你的情况无关。