Recentemente ho notato un problema con la mia applicazione e penso che sia dovuto al fatto che non uso correttamente boost::asio
e don ' t capire cosa fa un resolver tcp.Differenza tra la risoluzione di una query e la creazione di un endpoint con IP e porta (in boost asio)
Fondamentalmente, utilizzo uno boost::asio::ip::tcp::resolver
per ottenere gli endpoint a cui connettersi.
Quello che ho scoperto di recente è che può venire con più di un endpoint (in particolare quando mi collego all'host locale).
Al momento richiedo uno async_connect
su tutto il punto finale. Non sono sicuro al 100%, ma penso che sia male. Dovrei andare da loro una a una richiesta async_connect, attendere la risposta e provare su quella successiva se e solo se fallisce.
Quindi, in pratica, sapendo che ho due scelte, se voglio usare async_connect
su quei punti finali:
rifattorizziamo il mio codice in modo che il mio
async_connect
fallimento di gestire correttamente e in caso di errore tenta di collegarsi all'altro disponibili endpoint. Dovrei passare quindi l'iteratore dell'endpoint.cadere il resolver e utilizzare un endpoint costruisco me stesso in questo modo:
boost::asio::ip::tcp::endpoint("localhost", 20015)
I tipi di avere la sensazione che dovrei usare la prima soluzione e che il risolutore sta portando qualcosa di più che l'auto endpoint costruito.
Ma cosa porta il risolutore e in che modo l'auto-costruito si risolve da solo?
Grazie per la risposta, è molto utile. Ho scoperto, tuttavia, che l'uso asincrone risoluzione era irregolare (la mia piattaforma è la finestra e ho spesso ottenere '' 995' errore WSA_OPERATION_ABORTED'). Così ho optato per una soluzione intermedia con determinazione sincrono e asincrono iterativo collegare su ogni punto finale, e sì refactoring il mio codice è stato facile. – Arthur