diff --git a/src/client.cpp b/src/client.cpp index 4fe721c..7ba08e4 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1146,37 +1146,42 @@ void ContextImpl::tickSearch(SearchKind kind, bool poked) to_wire(H, Header{CMD_SEARCH, 0, uint32_t(consumed-8u)}); } for(auto& pair : searchDest) { - auto& dest = pair.first.addr.family()==AF_INET ? searchTx4 : searchTx6; + auto& dest = pair.dest.addr.family()==AF_INET ? searchTx4 : searchTx6; - if(pair.second) { + if(pair.isucast) { *pflags |= pva_search_flags::Unicast; } else { *pflags &= ~pva_search_flags::Unicast; - dest.mcast_prep_sendto(pair.first); + dest.mcast_prep_sendto(pair.dest); } int ntx = sendto(dest.sock, (char*)searchMsg.data(), consumed, 0, - &pair.first.addr->sa, pair.first.addr.size()); + &pair.dest.addr->sa, pair.dest.addr.size()); if(ntx<0) { int err = evutil_socket_geterror(dest.sock); auto lvl = Level::Warn; - if(err==EINTR || err==EPERM) + if(err==EINTR || err==EPERM || !pair.lastSuccess) lvl = Level::Debug; log_printf(io, lvl, "Search tx %s error (%d) %s\n", - pair.first.addr.tostring().c_str(), err, evutil_socket_error_to_string(err)); + pair.dest.addr.tostring().c_str(), err, evutil_socket_error_to_string(err)); + pair.lastSuccess = false; } else if(unsigned(ntx) std::vector searchMsg; // search destination address and whether to set the unicast flag - std::vector> searchDest; + struct SearchDest { + const SockEndpoint dest; + const bool isucast; + bool lastSuccess = true; + SearchDest(SockEndpoint dest, bool isu) :dest(dest), isucast(isu) {} + }; + + std::vector searchDest; size_t currentBucket = 0u; // Channels where we have yet to send out an initial search request