Winsock getaddrinfo未处理的ntdll.dll中的异常/崩溃

时间:2018-11-06 02:56:58

标签: c windows winapi winsock

我正在尝试使用GetAddrInfoExW()来解析C中的主机名

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

看来我传递的所有值都是正确的。我还尝试了Unicode和Ansi中的GetAddrInfoEx和GetAddrInfo。每次运行时,堆栈跟踪也会更改。

我还尝试使用不赞成使用的gethostbyname,它给出了类似的结果...

已解决:我认为较早的分配已损坏了堆。通过分配固定的更多空间。谢谢大家

1 个答案:

答案 0 :(得分:2)

当您在堆栈顶部看到RtlAllocateHeap的异常时,代码中的错误发生得更早了:RltAllocateHeap表示应用程序中的某些先前操作破坏了堆结构。

您可以在致电HeapValidate等之前先致电GetAddr...进行验证。