windows网络编程 实现域名查询ip

阅读:290 2019-03-19 15:27:14 来源:csdn

#include#include#include#include#pragmawarning(disable:4996)#pragmacomment(lib,"ws2_32.lib")usingnamespacestd;intmain(intargc,char**argv){//-----------------------------------------//declareandinitializevariables/**wsadata结构被用来储存调用afxsocketinit全局函数返回的windowssockets初始化信息。*这个结构被用来存储被wsastartup函数调用后返回的windowssockets数据。它包含winsock.dll执行的数据。*/wsadatawsadata;intiresult;dworddwerror;/*每个word为2个字节的长度,dword双字即为4个字节,每个字节是8位*/inti=0;structhostent*remotehost;/*域名*/char*host_name;/*主机名*/structin_addraddr;/*ip*/char**palias;//---------------------注意下面的话------------------------//开始卡在这里卡了好久,这里是检查输入的参数,原来网上的版本是2意思是你还得输入一个参.

//就像get_ip.exewwwbaidu.com这里就是两个参数,前面的加上后面的域名//validatetheparametersif(argc!=1){printf("usage:gethostiphostnamen");return1;}//此处应添加的程序如下//1.当初始化winsocketiresult=wsastartup(makeword(2,2),&wsadata);/*&取地址*///2.检查该socket是否初始化成功,即该socket是否等于0;如果初始化不成功,应当给出错误报警,并结束程序。if(iresult!=0){printf("初始化失败!n");return1;}/////////////////结束/////////////////////////////////////host_name=argv[1];cout<<"输入要查询的域名:";charhost[20];//定义一个数组存放输入的域名,并把值传递给host_namecin>>host;host_name=host;//host_name="www.baidu.com";printf("callinggethostbynamewith%sn",host_name);//此处应添加的程序如下//1.利用函数gethostbyname(),获取给定主机名的指针。remotehost=gethostbyname(host_name);//2.应当熟悉该结构指针的结构//其中该函数申明如下:structhostent*gethostbyname(constchar*name)//此处应添加的程序如下//1.如果上面函数返回的主机结构指针为空(null),则做如下处理://a.利用函数intwsagetlasterror(void)检查当前是否发生网络错误,//b.返回的发生的错误类型并作相应的处理,比如,若没有找到主机的错误(此时该函数返回wsahost_not_found)if(remotehost==null){dwerror=wsagetlasterror();if(dwerror!=0){if(dwerror==wsahost_not_found){printf("hostnotfoundn");return1;}elseif(dwerror==wsano_data){printf("nodatarecordfoundn");return1;}else{printf("functionfailedwitherror:%ldn",dwerror);return1;}}}else{printf("functionreturned:n");printf("tofficialname:%sn",remotehost->h_name);for(palias=remotehost->h_aliases;*palias!=0;palias++){printf("talternatename#%d:%sn",++i,*palias);}printf("taddresstype:");switch(remotehost->h_addrtype){caseaf_inet:printf("af_inetn");break;caseaf_netbios:printf("af_netbiosn");break;default:printf("%dn",remotehost->h_addrtype);break;}printf("taddresslength:%dn",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("tipaddress#%d:%sn",i,inet_ntoa(addr));}}elseif(remotehost->h_addrtype==af_netbios){printf("netbiosaddresswasreturnedn");}}system("pause");/*防止窗体关闭函数*/return0;}

照着书敲的代码愣是改了半天,vs大法好啊,环境就调了半天把遇到的问题一起上传上来吧编译器报错c4996报错的情况通常为:1错误8errorc4996:'sprintf':thisfunctionorvariablemaybeunsafe.considerusingsprintf_sinstead.todisabledeprecation,use_crt_secure_no_warnings.seeonlinehelpfordetails.此时,通常有3种方式可以解决:(1)使用vs提供的编译器选择性提供warning功能link:http://msdn.microsoft.com/en-us/library/2c8f766e.aspx例:使用#pragmawarning(disable:4996)即可消除。(2)设置预处理选项:a.projectproperties->configurationproperties->c/c++->preprocessor->preprocessordefinitionsb.点击按钮(...)c.输入:_crt_secure_no_warnings。注:使用"n"相隔(3)在引用库文件开头写一个宏定义1#define_crt_secure_no_warnings2#include来自//---------------------注意下面的话------------------------//开始卡在这里卡了好久,这里是检查输入的参数,原来网上的版本是2意思是你还得输入一个参数,//就像get_ip.exewwwbaidu.com这里就是两个参数,前面的加上后面的域名//validatetheparametersif(argc!=1){printf("usage:gethostiphostnamen");return1;}好久没碰c++,绕不过这个坎,劝大家好好学学吧—》这个是网上的版本,大家参考吧//gethostip.cpp:定义控制台应用程序的入口点。//

#include"stdafx.h"#include#include#include#include#pragmacomment(lib,"ws2_32.lib")intmain(intargc,char**argv){//-----------------------------------------//declareandinitializevariables/**wsadata结构被用来储存调用afxsocketinit全局函数返回的windowssockets初始化信息。*这个结构被用来存储被wsastartup函数调用后返回的windowssockets数据。它包含winsock.dll执行的数据。*/wsadatawsadata;intiresult;dworddwerror;/*每个word为2个字节的长度,dword双字即为4个字节,每个字节是8位*/inti=0;structhostent*remotehost;/*域名*/char*host_name;/*主机名*/structin_addraddr;/*ip*/char**palias;//validatetheparametersif(argc!=2){printf("usage:gethostiphostnamen");return1;}//此处应添加的程序如下//1.当初始化winsocketiresult=wsastartup(makeword(2,2),&wsadata);/*&取地址*///2.检查该socket是否初始化成功,即该socket是否等于0;如果初始化不成功,应当给出错误报警,并结束程序。if(iresult!=0){printf("初始化失败!n");return1;}/////////////////结束///////////////////////////////////host_name=argv[1];printf("callinggethostbynamewith%sn",host_name);//此处应添加的程序如下//1.利用函数gethostbyname(),获取给定主机名的指针。remotehost=gethostbyname(host_name);//2.应当熟悉该结构指针的结构//其中该函数申明如下:structhostent*gethostbyname(constchar*name)//此处应添加的程序如下//1.如果上面函数返回的主机结构指针为空(null),则做如下处理://a.利用函数intwsagetlasterror(void)检查当前是否发生网络错误,//b.返回的发生的错误类型并作相应的处理,比如,若没有找到主机的错误(此时该函数返回wsahost_not_found)if(remotehost==null){//printf("gethostbynameerror:%d",wsagetlasterror());return1;}else{//2.如果返回的主机指针不为空,则做如下处理://a.打印出如下参数:主机名和ip地址,若该主机对应于多个ip地址,应当分别列出。printf("主机名:%sn",remotehost->h_name);for(i=0;;i++){if(remotehost->h_addr_list[i]!=0){/*从缓存中把p拷贝到addr中*同时addr.s_un.saddr*in_addripaddr;*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:%sn",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_addripaddr;*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地址为:%sn",inet_ntoa(addr));*/}}//此处应添加的程序如下//程序完成后应当适当测试,需要进行的测试如下://1.测试主机结构指针获取失败//2.测试包含多个ip地址的主机//3.你能想到的任何可能出现的异常情况/////////////////结束///////////////////////////////////system("pause");/*防止窗体关闭函数*/return0;}

相关文章
{{ v.title }}
{{ v.description||(cleanHtml(v.content)).substr(0,100)+'···' }}
你可能感兴趣
推荐阅读 更多>
推荐商标

{{ v.name }}

{{ v.cls }}类

立即购买 联系客服