2017-08-08 76 views
-1

Winsock Reference page,它說:如何獲取getaddrinfo()錯誤代碼?

getaddrinfo函數

返回值

成功返回零。失敗返回一個非零的Windows套接字錯誤代碼,如在Windows套接字錯誤代碼中找到的

使用gai_strerror函數根據由getaddrinfo函數返回的EAI代碼來打印錯誤消息。提供gai_strerror函數是爲了符合IETF建議,但它不是線程安全的。 因此,建議使用WSAGetLastError等傳統Windows套接字函數。

它說,EAI的錯誤代碼可以在Windows Sockets Error Codes page可以找到,但我不能看到該網頁,如EAI_AGAIN,EAI_BADFLAGS等任何EAI代碼...

對於Windows,正確的獲取代碼的方法是檢查getaddrinfo是否返回非零值,然後致電WSAGetLastError以獲取代碼?

+0

雅你使用WSAGetLastError,這裏是如何檢索相應的字符串:https://stackoverflow.com/questions/3400922/how-do-i-retrieve-an-error-string-from-wsagetlasterror?rq=1 – Asesh

+0

'它表示EAI錯誤代碼可以在Windows套接字錯誤代碼頁面找到'。不,它沒有。它在該MSDN頁面上提供了映射*。* – EJP

回答

1

是的,標準方法是使用getaddrinfo,如果返回非零值,則調用WSAGetLastError來檢索Winsock錯誤代碼。

然後可以使用FormatMessage錯誤代碼轉換爲人類可讀的字符串,通過傳遞FORMAT_MESSAGE_FROM_SYSTEM作爲dwFlags參數,並且錯誤代碼爲dwMessage參數。您可以在FORMAT_MESSAGE_FROM_SYSTEM下的表格中看到此行爲的文檔here。 Asesh指出this link有一些示例代碼演示了這一點。

您可以使用gai_strerror像在Linux系統上,但according to MSDN(搜索gai_strerror),它不是線程安全的,從而FormatMessage是首選。

或者,您可以手動將它們與this nice big list交叉引用。