windows网络编程 实现域名查询ip
来源:互联网 发布:启明家电维修软件 编辑:程序博客网 时间:2024/05/23 18:38
#include <winsock2.h> #include <ws2tcpip.h> #include <iostream> #include <windows.h> #pragma warning( disable : 4996)#pragma comment(lib, "ws2_32.lib") using namespace std;int main(int argc, char **argv){//----------------------------------------- // Declare and initialize variables /** WSADATA结构被用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息。* 这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。*/WSADATA wsaData;int iResult;DWORD dwError; /*每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位*/int i = 0;struct hostent *remoteHost; /*域名*/char *host_name; /*主机名*/struct in_addr addr; /*ip*/char **pAlias; //---------------------注意下面的话------------------------// 开始卡在这里卡了好久,这里是检查输入的参数,原来网上的版本是 2 意思是你还得输入一个参数,//就像 get_ip.exe wwwbaidu.com 这里就是两个参数,前面的加上后面的域名// Validate the parameters if (argc != 1) {printf("usage: GetHostIP hostname\n");return 1;}// 此处应添加的程序如下 // 1. 当初始化winsocket iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);/* & 取地址*/ // 2. 检查该socket是否初始化成功,即该socket是否等于0;如果初始化不成功,应当给出错误报警,并结束程序。 if (iResult != 0) {printf("初始化失败!\n");return 1;}/////////////////结束/////////////////////////////////// //host_name = argv[1];cout << "输入要查询的域名: ";char host[20];//定义一个数组存放输入的域名,并把值传递给 host_namecin >> host;host_name = host;//host_name = "www.baidu.com";printf("Calling gethostbyname with %s\n", host_name);// 此处应添加的程序如下 // 1. 利用函数gethostbyname(),获取给定主机名的指针。 remoteHost = gethostbyname(host_name);// 2. 应当熟悉该结构指针的结构 // 其中该函数申明如下:struct hostent* gethostbyname(const char *name) // 此处应添加的程序如下 // 1. 如果上面函数返回的主机结构指针为空(NULL),则做如下处理: // a. 利用函数 int WSAGetLastError ( void ) 检查当前是否发生网络错误, // b. 返回的发生的错误类型并作相应的处理,比如,若没有找到主机的错误(此时该函数返回WSAHOST_NOT_FOUND) if (remoteHost == NULL) {dwError = WSAGetLastError();if (dwError != 0) {if (dwError == WSAHOST_NOT_FOUND) {printf("Host not found\n");return 1;}else if (dwError == WSANO_DATA) {printf("No data record found\n");return 1;}else {printf("Function failed with error: %ld\n", dwError);return 1;}}}else {printf("Function returned:\n");printf("\tOfficial name: %s\n", remoteHost->h_name);for (pAlias = remoteHost->h_aliases; *pAlias != 0; pAlias++) {printf("\tAlternate name #%d: %s\n", ++i, *pAlias);}printf("\tAddress type: ");switch (remoteHost->h_addrtype) {case AF_INET:printf("AF_INET\n");break;case AF_NETBIOS:printf("AF_NETBIOS\n");break;default:printf(" %d\n", remoteHost->h_addrtype);break;}printf("\tAddress length: %d\n", remoteHost->h_length);i = 0;if (remoteHost->h_addrtype == AF_INET){while (remoteHost->h_addr_list[i] != 0) {addr.s_addr = *(u_long *)remoteHost->h_addr_list[i++];printf("\tIP Address #%d: %s\n", i, inet_ntoa(addr));}}else if (remoteHost->h_addrtype == AF_NETBIOS){printf("NETBIOS address was returned\n");}}system("pause"); /*防止窗体关闭函数*/return 0;}照着书敲的代码愣是改了半天,VS大法好啊,环境就调了半天把遇到的问题一起上传上来吧编译器报错C4996报错的情况通常为:1错误 8 error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use_CRT_SECURE_NO_WARNINGS. See online help for details.此时,通常有3种方式可以解决:(1)使用VS提供的 编译器选择性提供warning功能 link: http://msdn.microsoft.com/en-us/library/2c8f766e.aspx例:使用 #pragma warning( disable : 4996) 即可消除。(2) 设置预处理选项:a. Project properties->Configuration Properties->C/C++->Preprocessor->Preprocessor Definitionsb. 点击按钮 (...)c. 输入:_CRT_SECURE_NO_WARNINGS。 注:使用 "\n" 相隔(3)在引用库文件开头写一个宏定义1 #define _CRT_SECURE_NO_WARNINGS2 #include <stdio.h>来自 <https://zhidao.baidu.com/question/434204650624968924.html> //---------------------注意下面的话------------------------// 开始卡在这里卡了好久,这里是检查输入的参数,原来网上的版本是 2 意思是你还得输入一个参数,//就像 get_ip.exe wwwbaidu.com 这里就是两个参数,前面的加上后面的域名// Validate the parameters if (argc != 1) {printf("usage: GetHostIP hostname\n");return 1;}好久没碰C++,绕不过这个坎,劝大家好好学学吧—》这个是网上的版本,大家参考吧// GetHostIP.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h" #include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <windows.h>#pragma comment(lib, "ws2_32.lib") int main(int argc, char **argv){ //----------------------------------------- // Declare and initialize variables /* * WSADATA结构被用来储存调用AfxSocketInit全局函数返回的Windows Sockets初始化信息。 * 这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。 */ WSADATA wsaData; int iResult; DWORD dwError; /*每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节是8位*/ int i = 0; struct hostent *remoteHost; /*域名*/ char *host_name; /*主机名*/ struct in_addr addr; /*ip*/ char **pAlias; // Validate the parameters if (argc != 2) { printf("usage: GetHostIP hostname\n"); return 1; } // 此处应添加的程序如下 // 1. 当初始化winsocket iResult = WSAStartup(MAKEWORD(2,2),&wsaData);/* & 取地址*/ // 2. 检查该socket是否初始化成功,即该socket是否等于0;如果初始化不成功,应当给出错误报警,并结束程序。 if(iResult!=0){ printf("初始化失败!\n"); return 1; } /////////////////结束/////////////////////////////////// host_name = argv[1]; printf("Calling gethostbyname with %s\n", host_name); // 此处应添加的程序如下 // 1. 利用函数gethostbyname(),获取给定主机名的指针。 remoteHost = gethostbyname(host_name); // 2. 应当熟悉该结构指针的结构 // 其中该函数申明如下:struct hostent* gethostbyname(const char *name) // 此处应添加的程序如下 // 1. 如果上面函数返回的主机结构指针为空(NULL),则做如下处理: // a. 利用函数 int WSAGetLastError ( void ) 检查当前是否发生网络错误, // b. 返回的发生的错误类型并作相应的处理,比如,若没有找到主机的错误(此时该函数返回WSAHOST_NOT_FOUND) if(remoteHost == NULL){ //printf("gethostbynameError:%d",WSAGetLastError()); return 1; }else{ // 2. 如果返回的主机指针不为空,则做如下处理: // a. 打印出如下参数:主机名和IP地址,若该主机对应于多个ip地址,应当分别列出。 printf("主机名:%s\n",remoteHost->h_name); for(i=0;;i++){ if(remoteHost->h_addr_list[i]!=0) { /*从缓存中把 p 拷贝到addr中 *同时addr.S_un.Saddr * in_addr ipAddr; * ipAddr.S_un.S_addr = inet_addr("127.0.0.1"); * 就是把字符串形式的ip地址转化为0xXXXXXXXX形式的地址格式。 */ addr.s_addr = *(u_long*)remoteHost->h_addr_list[i]; printf("ip #%d:%s\n",i,inet_ntoa(addr)); /* inet_ntoa() 函数将网络地址转成二进制的数字相关函数:inet_aton, inet_ntoa */ } /* for(i=0;;i++){ char *p = remoteHost->h_addr_list[i]; if(p==NULL) break; /*从缓存中把 p 拷贝到addr中 *同时addr.S_un.Saddr * in_addr ipAddr; * ipAddr.S_un.S_addr = inet_addr("127.0.0.1"); * 就是把字符串形式的ip地址转化为0xXXXXXXXX形式的地址格式。 * memcpy(&addr.S_un.S_addr,p,remoteHost->h_length); printf("ip地址为:%s\n",inet_ntoa(addr)); */ } } // 此处应添加的程序如下 // 程序完成后应当适当测试,需要进行的测试如下: // 1. 测试主机结构指针获取失败 // 2. 测试包含多个IP地址的主机 // 3. 你能想到的任何可能出现的异常情况 /////////////////结束/////////////////////////////////// system("pause"); /*防止窗体关闭函数*/ return 0;}
阅读全文
1 0
- windows网络编程 实现域名查询ip
- linux 网络域名ip查询命令
- C#实现根据域名查询ip实例
- C#实现根据域名查询ip实例
- 域名转ip地址编程实现
- java网络编程-获取域名和ip地址
- java网络编程根据域名获取ip地址,URL
- TCP/IP网络编程 学习笔记_9 --域名系统(DNS)
- Linux网络编程 - 域名与IP信息解析
- Windows IP转化域名
- C#实现根据域名查询ip实例(原创)
- 【winsock2】windows网络编程 之 UDP/IP
- 查询域名对应的IP
- 根据域名查询IP地址
- 【C语言】查询域名IP
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- Java之反射机制
- Jquery easyui 将前台数据进行转换
- 卷积神经网络新思路
- Hibernate入门(8):SQL查询
- 机器学习:手写数字识别(Hand-written digits recognition)小项目
- windows网络编程 实现域名查询ip
- 基于TF-IDF的酒店名称模糊匹配
- 欢迎使用CSDN-markdown编辑器
- Java之多线程
- 大数加法乘法
- proto3变量类型
- hive压缩格式
- 通过驱动对象得到Hookport.sys的基地址和大小
- JQuery 列队动画 demo