2014-01-16 79 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,看起來相當不錯。