2014-01-16 68 views
1

如果连接端点是类似tcp://192.168.0.2:9876的IP,则Socket.connect将立即返回。但是,如果端点包含一个DNS名称,如tcp://server.local。:9876,则Socket.connect似乎会阻塞到server.local。已解析,并最终失败并在名称无法解析时引发zmq.error.ZMQError异常。ZeroMQ连接阻塞

有没有办法以非阻塞的方式连接?

+0

这与[this one](http://stackoverflow.com/questions/21169031)的问题完全相同,两个小时前发布 – goncalopp

回答

2

DNS主机名解析以同步的方式进行内部zmq::socket_base_t::connect

// Resolve address (if needed by the protocol) 
if (protocol == "tcp") { 
    paddr->resolved.tcp_addr = new (std::nothrow) tcp_address_t(); 
    alloc_assert (paddr->resolved.tcp_addr); 
    int rc = paddr->resolved.tcp_addr->resolve (
     address.c_str(), false, options.ipv6); 
    if (rc != 0) { 
     delete paddr; 
     return -1; 
    } 
} 

因此看来你没有其他选择,但做自己的异步DNS解析,然后通过解析地址ZeroMQ。

您可能会找到有用的下列resolver example。它基于pyuv/pycares,看起来相当不错。