experiment: host to ip

/**
* @file prjUrl2Ip.cpp
* @brief 将主机地址翻译成IP地址, 例如: hi.csdn.net => 117.79.157.204
* 应用场景: 当主机IP是不固定的IP, 由DNS翻译
* @note 如果参数是 xx://hi.csdn.net, Host2Ip会失败.
* 解决方法: 处理URL, 将主机地址扒出来作为Host2Ip的参数
*/

#include "stdafx.h" //empty file

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#endif						

#include <winsock2.h>
#include <windows.h>
#include <tchar.h>
#include <string>

#include <ws2tcpip.h>
#include <atlbase.h>

#pragma comment(lib, "Ws2_32.lib")

#ifndef tstring
#ifdef _UNICODE
#define tstring std::wstring
#else
#define tstring std::string
#endif
#endif

#define ERR_SOCKET_BASE 100
#define ERR_SOCKET_NOT_EXIST		ERR_SOCKET_BASE + 1
#define ERR_SOCKET_VERSION			ERR_SOCKET_BASE + 2

INT Host2Ip(CONST TCHAR * pcNodeName, WORD wPort, TCHAR *& pcBufIp, 
			INT iLenBufIp);
INT SocketInit();
INT SocketUnInit(INT iRcSocketInit);

int _tmain(int argc, _TCHAR* argv[])
{
	INT iRcSocket = S_OK;
	INT iRcApp = S_OK;

	tstring strHost = _T("hi.csdn.net");
	WORD wPort = 80;

	TCHAR cIp[_MAX_PATH];
	ZeroMemory(cIp, sizeof(cIp));

	TCHAR * pcIp = cIp;

	iRcSocket = SocketInit();
	if(S_OK != iRcSocket)
	{
		goto END;
	}

	iRcApp = Host2Ip(strHost.c_str(), wPort, pcIp, sizeof(cIp) / sizeof(TCHAR));
	if(S_OK == iRcApp)
	{
		_tprintf(_T("Host[%s]'s Ip is[%s]\n"), strHost.c_str(), cIp);
	}

END:
	if((S_OK != iRcSocket) || (S_OK != iRcApp))
	{
		_tprintf(_T("sorry, error happen\n"));
	}

	SocketUnInit(iRcSocket);

	_tprintf(_T("END, press any key to quit\n"));

	/**
	* run results
	Host[hi.csdn.net]'s Ip is[117.79.157.204]
	END, press any key to quit
	*/

	getchar();
	return 0;
}

INT Host2Ip(CONST TCHAR * pcNodeName, WORD wPort, TCHAR *& pcBufIp, 
			INT iLenBufIp)
{
	USES_CONVERSION;
	INT iRc = S_FALSE;
	DWORD dwIP = 0;

	SOCKET sock = INVALID_SOCKET;
	ADDRINFOA aiHints;
	in_addr inIp;
	ADDRINFOA * aiRes = NULL;
	TCHAR pcServName[6];

	ZeroMemory(pcServName, sizeof(pcServName));
	_stprintf_s(pcServName, sizeof(pcServName) / sizeof(TCHAR), _T("%d"), wPort);

	ZeroMemory(&aiHints, sizeof(aiHints));
	aiHints.ai_family = AF_INET;
	aiHints.ai_socktype = SOCK_STREAM;
	aiHints.ai_protocol = IPPROTO_TCP;

	try
	{
		if(0 != getaddrinfo(W2A(pcNodeName), W2A(pcServName), &aiHints, 
			&aiRes))
		{
			goto END;
		}

		if(aiRes)
		{
			memcpy((char*)&dwIP, aiRes->ai_addr->sa_data+2, sizeof(DWORD));
			freeaddrinfo(aiRes);
		}
		else
		{
			dwIP = inet_addr(W2A(pcNodeName));
		}

		if(0 == dwIP)
		{
			goto END;
		}

		inIp.S_un.S_addr = dwIP;
		_tcscpy_s(pcBufIp, iLenBufIp, A2W(inet_ntoa(inIp)));
	}
	catch(...)
	{
		dwIP = 0;
		goto END;
	}

	iRc = S_OK;
END:
	return iRc;
}

INT SocketInit()
{
	WSADATA wsaData;
	int iRc = S_FALSE;

	if(0 != WSAStartup(MAKEWORD(2, 2), &wsaData))
	{
		iRc = ERR_SOCKET_NOT_EXIST;
		goto END;
	}

	if((LOBYTE( wsaData.wVersion) != 2) || (HIBYTE( wsaData.wVersion) != 2))
	{
		iRc = ERR_SOCKET_VERSION;
	}

	iRc = S_OK;

END:
	return iRc;
}

INT SocketUnInit(INT iRcSocketInit)
{
	if(ERR_SOCKET_NOT_EXIST != iRcSocketInit)
	{
		WSACleanup();
	}

	return S_OK;
}


你可能感兴趣的:(experiment: host to ip)