2011-03-20 43 views
0

如何在沒有#include <winsocket2.h>的情況下檢索與主機名相關的IP? 我不能使用<winsocket2.h>方法,因爲我沒有任何編譯錯誤DLL crashs,下面的代碼無法正常工作......IP查找主機名無#include <winsocket2.h>

hostent *h = gethostbyname(hostName); 
     LogAlways((const char*)inet_ntoa(*(reinterpret_cast<in_addr*>(h->h_addr)))); 
+1

給我們更多的代碼 - 肯定是你做錯了,但你怪怪winsocket – fazo 2011-03-20 03:19:14

+0

'hostName'的*值*是什麼?驗證這是你認爲它應該使用調試器。在那行之後,檢查'h'中存儲了什麼 - 如果發生錯誤(例如主機查找失敗),它可能是空指針。這將很好地保證你的下一條線會以某種方式失敗。你需要優雅地處理失敗,而不是假定失敗。 – Cascabel 2011-03-20 04:03:24

+0

我正在使用visual studio 2008快速版,是啊,它不是我自己的DLL .. hostName的類型是const char *,函數LogAlways允許它 – 2011-03-20 03:25:41

回答

1

如果沒有一個包括(或外部庫的依賴性)有幾乎是沒辦法。

爲了獲得映射到IP的主機名,您需要做一個RARP請求,這幾乎要求您能夠使用套接字。所以無論如何,你需要能夠創建一個套接字。這是winsock2.lib提供的庫。

所以,你最好讓winsock2.lib工作。當你說你的DLL崩潰時沒有任何編譯錯誤,我假設你正在談論你自己的代碼,你正試圖編譯成一個DLL。

如何調試?你有沒有嘗試通過代碼來看看它失敗的地方?什麼是hostname的類型?檢查以確保您不試圖訪問空指針上的成員。而且在使用變量之前你已經正確地分配了內存。否則,讓我們更具體地瞭解您在調試器中得到的錯誤消息。

+0

您可以使用'LoadLibrary'調用'ws2_32.dll'中的函數, GetProcAddress'。 '#include'沒有必要。 'winsock2.lib'沒有必要。並且該程序有機會從舊版Windows上的缺失功能中恢復。 – 2011-03-20 04:16:58

+0

是的,本的權利..我的意思是說,如果不依賴外部圖書館,你不能真正離開。無論是winsock2還是別的什麼.. – 2011-03-20 04:49:08