Winsock getaddrinfo необработанное исключение / сбой в ntdll.dll - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь разрешить имя хоста в C с помощью GetAddrInfoExW ()

struct addrinfoexW hints, *res;
int errcode;
void *ptr = 0;

ZeroMemory(&hints, sizeof(struct addrinfoexW));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags |= AI_CANONNAME;

errcode = GetAddrInfoExW(
    L"google.de", // pName
    L"80", // pServiceName
    NS_DNS, // dwNameSpace
    NULL, // lpNspId
    &hints, // hints
    &res, // ppResult
    NULL, // timeout
    NULL, // lpOverlapped
    NULL, // lpCompletionRoutine
    NULL // lpHandle
);
if (errcode != 0)
{
    //perror("getaddrinfo");
    return -1;
}

... но при вызове GetAddrInfoEx всегда происходит сбой:

ntdll.dll!RtlAllocateHeap() Unbekannt
mswsock.dll!SockLoadTransportMapping()  Unbekannt
mswsock.dll!SockGetTdiName()    Unbekannt
mswsock.dll!SockSocket()    Unbekannt
mswsock.dll!WSPSocket() Unbekannt
ws2_32.dll!WSASocketW() Unbekannt
ws2_32.dll!GetProtocolStateForFamily()  Unbekannt
ws2_32.dll!GetAddrInfoExW() Unbekannt
Main.exe!lookup_host(const wchar_t * host, addrinfo * out) Zeile 112

Кажется, все значения, которые я передаю, верны. Я также пытался с GetAddrInfoEx и GetAddrInfo, как в Unicode, так и в Ansi. Трассировка стека также изменяется при каждом запуске.

Я также пытался использовать устаревшее gethostbyname, которое дает похожий результат ...

Решено: куча была повреждена из-за более раннего выделения, я думаю. Исправлено распределение места. Спасибо всем

1 Ответ

0 голосов
/ 06 ноября 2018

Когда вы видите исключение с RtlAllocateHeap на вершине стека, ошибка в вашем коде произошла намного раньше: RltAllocateHeap указывает, что некоторые предыдущие действия в приложении повредили структуры кучи.

Вы можете проверить это, позвонив по номеру HeapValidate, прежде чем позвонить GetAddr... и т. Д.

...