experiment: host to ip

来源:互联网 发布:最优化导论 第四版pdf 编辑:程序博客网 时间:2024/06/05 22:48
/*** @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_EXISTERR_SOCKET_BASE + 1#define ERR_SOCKET_VERSIONERR_SOCKET_BASE + 2INT 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 resultsHost[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;}


原创粉丝点击