需要用一个解析域名的函数,网上一搜一堆:gethostbyname。于是查了下下MSDN,发现那个hostent结构还是挺麻烦的,按照说明很快写出了相关的代码,
phe = gethostbyname("www.xxx.com");
TRACE("%s", inet_ntoa(*(struct in_addr*)(phe->h_addr_list[0])));
但试来试去老是报错,又查了网上N多资料还是不知道究竟是哪里出错了,耽误了很长时间,郁闷。。。
后来把代码加上函数调用是否成功的判断,再一查错误码,晕,原来是忘记WSASStartup了。。。汗
加上后的代码如下,运行成功。
看来防御性编程还是很有必要的,总是为出错的可能做好准备,即使出错的概率非常小,小到如内存不足时用malloc或者new分配内存出错的概率都应该时时做好准备。
#include "stdafx.h"
#include "GetHost.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 唯一的应用程序对象
CWinApp theApp;
using namespace std;
struct hostent* phe;
struct in_addr ia;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
// 初始化 MFC 并在失败时显示错误
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: 更改错误代码以符合您的需要
_tprintf(_T("致命错误: MFC 初始化失败/n"));
nRetCode = 1;
}
else if(!AfxSocketInit()) // 这里隐式地调用了WSAStartup
{
_tprintf(_T("致命错误: WinSocks 初始化失败/n"));
nRetCode = 2;
}
else
{
phe = gethostbyname("www.jisuwl.com");
if (!phe)
{
cout << "get error!" << endl;
TRACE("ERROR CODE:%d", WSAGetLastError());
return 3;
}
// 这里实际是个表,后面还可能有别的IP的,这里偷懒就没写
memcpy(&ia, (phe->h_addr_list)[0], sizeof(struct in_addr));
TRACE("%s", inet_ntoa(ia));
*/
}
return nRetCode;
}