c++ - que - localhost/moodle
boost:: asio no pudo conectarse a localhost sin WLAN (3)
No tengo una explicación de por qué tienes este error. Sin embargo, lo que hice en un proyecto no fue especificando el número de puerto directamente, sino más bien construyendo la instancia de punto final en dos pasos. No recuerdo el razonamiento en el momento para hacerlo de esta manera, pero podría ayudarlo.
Mi solución propuesta es algo como esto:
ip::tcp::resolver::query query(ip::tcp::v4(), "localhost", ""); // empty service name
tcp::resolver::iterator it_endpoint = resolver.resolve(query);
ip::tcp::endpoint endpoint(ip::tcp::endpoint(*it_endpoint).address(), port);
Este es un extracto resumido de lo que hice, por lo que puede no compilar tal como está.
En mi computadora (Surface Pro 2), solo hay un adaptador de red, es un adaptador LAN inalámbrico.
Trabajé en un pequeño proyecto de C ++, usa boost :: asio para conectar con localhost y hacer su trabajo, todo está bien.
Pero hoy descubrí que si desconecto la WLAN de Internet, este programa no funciona.
Se generará una excepción por resolver de boost :: asio :
tcp::resolver::query query("localhost", "10127");
tcp::resolver resolver(io_service_);
tcp::resolver::iterator iterator;
try {
iterator = resolver.resolve(query);
}
catch (boost::system::system_error& e) {
log(e.what());
}
Y el mensaje de error fue: el nombre solicitado es válido pero no se encontraron datos del tipo solicitado.
Ping al localhost está bien.
Me siento confundido, ¿un programa de red local necesita Internet? ¿Un programa de red local necesita un adaptador LAN? ¿Por qué el ping funciona bien?
la red local no requiere Internet para funcionar. En su caso, no sé exactamente el problema de la capa TCP / IP de Windows con resolve localhost
cuando no tiene ninguna configuración de servidor DNS (la tarjeta de red no está conectada, etc.etc). Pero puede usar tcp::resolver::query query("127.0.0.1", "10127");
en lugar de tcp::resolver::query query("localhost", "10127");
que funciona siempre
Acabo de tener el mismo problema en una máquina Linux y busqué la documentación del asio boost. Solo necesita agregar un argumento de indicador al constructor de la query
: tcp::resolver::query query("localhost","10127",tcp::resolver::query::canonical_name);
Nota: el nombre completo de la query
es boost::asio::ip::tcp::resolver::query
.
Esto sucede porque el argumento de indicadores predeterminado que se pasa aquí es boost::asio::ip::tcp::resolver::query::address_configured
, lo que significa que la llamada solo debe resolver las direcciones IPv4 / IPv6 si no se realiza un bucle IPv4 / IPv6 la dirección está configurada para el sistema.