Niedawno zauważyłem problem z moją aplikacją i myślę, że wynika to z faktu, że nie używam poprawnie boost::asio
i nie t zrozumieć, co robi resolver tcp.Różnica między rozwiązywaniem kwerendy i tworzeniem punktu końcowego za pomocą adresu IP i portu (w trybie zwiększania asio)
Zasadniczo używam boost::asio::ip::tcp::resolver
do pobierania punktów końcowych do połączenia.
Ostatnio odkryłem, że może on zawierać więcej niż jeden punkt końcowy (w szczególności, gdy łączę się z lokalnym hostem).
W tej chwili proszę o async_connect
we wszystkich punktach końcowych. Nie jestem w 100% pewny, ale myślę, że to źle. Powinienem po kolei wysyłać do nich żądanie async_connect, czekać na odpowiedź i spróbować wykonać następną, jeśli i tylko w przypadku niepowodzenia.
Więc w zasadzie wiedząc, że mam dwie możliwości jeśli chcę użyć async_connect
na tych punktów końcowych:
byłaby mój kod tak, że mój
async_connect
awaria uchwyt prawidłowo i na niepowodzenie próby połączenia do innych dostępnych punkt końcowy. Musiałbym wtedy przejść do iteratora punktu końcowego.Rzuć rozpoznawania nazw i używać końcowego skonstruować sobie tak:
boost::asio::ip::tcp::endpoint("localhost", 20015)
I niby mają poczucie, że powinienem użyć pierwsze rozwiązanie i że rezolwer przynosi coś więcej niż ja skonstruowany punkt końcowy.
Ale co przynosi resolwer i jak samoczynnie skonstruowany punkt końcowy sam go rozwiązuje?
Dzięki za odpowiedź, jest to bardzo pomocne. Dowiedziałem się jednak, że użycie async resolve było błędne (moja platforma to okno i dość często uzyskuje się błąd "WSA_OPERATION_ABORTED" '995'). Dlatego zdecydowałem się na rozwiązanie pośrednie z synchronicznym rozwiązaniem i iteracyjnym asynchronicznym połączeniem na każdym punkcie końcowym, a tak, refaktoryzacja mojego kodu była łatwa. – Arthur