ZeroMQ:重新绑定套接字时使用地址错误
ZeroMQ: Address in use error when re-binding socket
将ZeroMQ套接字绑定到端点并关闭套接字后,将另一个套接字绑定到同一端点需要多次尝试。之前对zmq_bind
的调用都失败了,错误是"地址在使用中"(EADDRINUSE
)。
#include <cassert>
#include <iostream>
#include "zmq.h"
int main() {
void *ctx = zmq_ctx_new();
assert( ctx );
void *skt;
skt = zmq_socket( ctx, ZMQ_REP );
assert( skt );
assert( zmq_bind( skt, "tcp://*:5555" ) == 0 );
assert( zmq_close( skt ) == 0 );
skt = zmq_socket( ctx, ZMQ_REP );
assert( skt );
int fail = 0;
while ( zmq_bind( skt, "tcp://*:5555" ) ) { ++fail; }
std::cout << fail << std::endl;
}
我在Windows XP SP3上使用ZeroMQ 4.0.3,编译器是VS 2008。libzmq.dll已使用提供的Visual Studio解决方案构建。
在做"调试"构建(上面的代码和libzmq.dll)和0
使用"发布"构建时,在这里打印1
。奇怪的是,当使用混合构建配置运行上面的代码时(使用发布库进行调试),fail
的计数最多为6。
Pieter Hintjens在邮件列表中给了我提示:
调用zmq_close
启动套接字关闭。这是在ZeroMQ启动的一个特殊的"死神"线程中完成的,以异步和非阻塞方式调用zmq_close
。请参阅ZeroMQ架构白皮书中的"The reaper thread"。
上面的代码没有等待线程执行实际工作,因此端点不会立即可用。
当TCP套接字关闭时,它进入称为TIME_WAIT
的状态。这意味着当套接字处于该状态时,它并没有真正关闭,这反过来又意味着套接字使用的地址在离开该状态之前是不可用的。
如果你连续运行你的程序两次,当你尝试第二次运行时,套接字将从第一次运行开始处于TIME_WAIT
状态,你会得到一个像这样的错误。
您可能想了解更多关于TCP的信息,特别是关于它的操作和状态。
相关文章:
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- 当客户端在 write() 期间终止连接时,由对等套接字错误重置连接
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 一个非常简单的win32套接字代码,但工作错误
- 在网络套接字计时器滴答后增加asio短读错误
- 当发生套接字错误时,作为QWebSocket基础的QTcpSocket(或QSslSocket)是否会自行销毁
- 如何在不设置 ulimit -n 的情况下解决套接字程序打开太多文件的错误
- 尝试关闭 SSL 套接字时使用升压 asio 1.64 的分段错误 (SIGSEGV)
- 包含线程后C++套接字错误WSAENOTSOCK (10038)
- 从客户端读取时出现套接字错误
- SFML 套接字 发送数据包时设置为 sf::套接字::错误
- 套接字错误 gcc 无法在 WinSock2.h 中获取函数
- UDP 套接字错误 10049
- 提升::ASIO 接受套接字错误已打开
- UDP TX/RX 中的套接字错误
- 正在处理windows套接字错误
- 使用读写函数的C中的套接字错误
- C++Winsock套接字错误:10038(WSAENOTSOCK)
- 套接字错误无法获取 WinSock2.h 中的函数
- 套接字错误的好资源