Pregunta

Estoy tratando de migrar un código de 32 bits de Windows (XP y Server 2003) para 64 bits de Windows 7, y yo estoy teniendo un problema extraño con gethostbyname.

Me estoy haciendo algo como esto:

struct hostent *hp;
hp = gethostbyname( host );

Después de la llamada a gethostbyname, el puntero HP-> h_addr_list no es válido. Tiene todos los números de la derecha, pero parece que un puntero de 32 bits quedó metido en el espacio equivocado de alguna manera.

Por ejemplo, lo que se ve es

HP-> h_addr_list = 0x0064bdd800000000

Si yo cambiaré manualmente la primera y la última mitad de modo que HP-> h_addr_list = 0x000000000064bdd8 continuación, el puntero es válido y apunta a los datos correctos.

A veces tengo baadf00d en lugar de ceros también (es decir, HP-> h_addr_list = 0x0064bdd8baadf00d),

Por lo que yo puedo decir todo lo que está vinculado a la versión correcta de 64 bits de las bibliotecas de Winsock, así que no estoy seguro de lo que podría causar este tipo de problema.

¿Fue útil?

Solución

Es posible que desee intentar usar getaddrinfo() lugar. Los para Gethostbyname señalan que su uso no se recomienda y que es obsoleta ahora (por lo que bien puede haber errores en ella). No he tenido ninguna experiencia con el problema que usted está teniendo, pero sé que el código que tengo que usos getaddrinfo() funciona bien a través de XP hasta Windows 7 en x86 y x64.

Otros consejos

baadf00d es utilizado por Microsoft para indicar la memoria sin inicializar montón asignado, por lo que la reducción a cero a cabo es probablemente una buena idea. Prueba para asegurarse.

Por lo que el canje de los bits de alta y baja, a la derecha, que la hacía ponerse en el lugar equivocado. Bug?

Me encontré con el mismo problema. El problema fue que en la configuración del proyecto la opción de alineación Struct miembro se establece en 4 bytes (/ ZP4). Volví a esta opción por defecto y esto resuelva el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top