从zmq.error.ZMQError中恢复:地址已经在使用中

我在运行与ZMQ的PAIR模式(非阻塞客户端服务器)连接时按Ctrl-C。 后来当我尝试运行REQ-REP (阻止客户端单服务器连接)模式时,我不断收到Address already in use错误。 我已经尝试使用netstat -ltnp | grep :<my port>运行netstat netstat -ltnp | grep :<my port>但没有列出任何进程。

那么究竟是谁在使用这个地址?

另外如何正常closures像这样的套接字连接?

问题1:

如果你使用sudo netstat -ltnp ,在一个Linux类型的操作系统上,你很可能会看到拥有这个端口的进程。 用kill -9 <pid>杀死它。

问题2:

当你退出程序时,关闭你的套接字然后调用zmq_ctx_destroy()。 这破坏了上下文。 有关更多信息,请参阅http://zguide.zeromq.org/page:all#toc17

在这个非常时刻:

 reboot 

下一个:

开始使用try: / except: / finally:封装构造函数,这将帮助您授予从所有zmq分配的gracefull退出 ,包括。 所有的Socket -s的.close()Context.Term()没有任何悬挂的孤立的内存泄漏,甚至万一任何恐慌按钮或未处理的异常中断您的代码执行完全丢失引用你的网络硬件绑定,实例挂起。

有时另一个使用zeromq的进程是保持使用端口,而netstat并不指示其他进程正在监听(所以netstat -lntp不会显示它),而是显示在具有相同主机/端口的端口上建立的连接两端。 杀死了另一个进程后,该端口现在可供使用。

原因1:我曾经遇到过这种情况,因为我在周围端口范围内设置了zeromq侦听端口(在linux上,例如32768-61000),这些端口被用作传出连接的本地端,我的服务需要连接到同一个盒子上的其他服务。 传出连接获取与框上侦听端口相同的临时端口的时间百分比,突然显示“地址已在使用中”。 我只是把所有的监听端口移出了短暂的端口范围,所有的“已经使用的地址”问题都消失了。

原因2:猜测:当我遇到类似的问题与其他python网络库,违规过程之前启动从侦听过程使用子进程或类似的,并有一个问题,泄漏到子进程的套接字, 如果父进程退出而没有关闭套接字,则套接字将保持活动状态,并由子进程拥有,即使子进程并不真正了解套接字,它仍然会被阻止,所以其他进程不能用它。

如果这是问题,可以通过在子进程之前调整套接字的标志来解决,例如(特定于unix):

 fd = sock.get(zmq.FD) old_flags = fcntl.fcntl(fd, fcntl.F_GETFD) fcntl.fcntl(fd, fcntl.F_SETFD, old_flags | fcntl.FD_CLOEXEC) 

或者也许有一种方法可以更好地关闭父进程中的套接字。