还剩6页未读,继续阅读
文本内容:
网络程序设计实验报告实验名称:winsock编程接口实验指导教师:继造专业班级:姓名:学号:实验地点:实验日期:实验成绩:
一、实验目的掌握Winsock的启动和初始化;掌握gethostnamegethostbynameGetAd叩terslnfo等信息查询函数的使用
二、实验设计一实验要求如下
1、编写程序能同时实现对多个域名的解析比如在控制台输入getipwww.
163.comwww.swust.edu.cn能输出www.
163.com和www.swust.edu.cn对应的IP地址列表
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址
二、设计
1、要实现对域名的解析,最主要是对gethostbyname函数的理解和应用函数原型为structhostent*gethostbynameconstchar*name;name为指向主机名的指针,它一般由函数gethostname返回函数返回对应于给定主机名的包含主机名字和地址信息的hostent结构指由于已知主机名即输入的域名,所以只要调用该函数就能得到ip地址列表根据分析可得出程序流程图如下:开始是否继续输入一输入域名,并存放在szHost
[256]调用gethostbyname函数,获得钻名的IP将网络字符地址转化成点分十进制输出IP地址列表
2、要得到本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址等信息,主要是对GetAdaptersInfoO函数的理解和应用该函数可以获取本地主机的所有适配器信息,并保存在pAdapterlnfo所指向的链表中函数原型为DWORDGetAdaptersInfoPIPADAPTERINFOpAdapterlnfo//buffertoreceivedataPULONGpOutBufLen//sizeofdatareturned;IP_ADAPTER_INFO的定义如下typedefstruct_IPADAPTERINFO{structIPADAPTERINFO*Next;DWORDComboindex;charAdapterName[MAX_ADAPTER_NAME_LENGTH+4];charDescription[MAX_ADAPTER_DESCRIPTION_LENGTH+4];UINTAddressLength;BYTEAddress[MAX_ADAPTER_ADDRESS_LENGTH];DWORDIndex;UINTType;UINTDhcpEnabled;P1PADDRSTRINGCurrentIpAddress;
三、实验过程
1.实验步骤如下:I建立一个C++程序工程,并建立同名的C++文件;2将教材上获取本机IP等信息代码输入;3将::gethostnameszHost256改为cout”请输入主机名endl;cin»szHost;4为主函数中的所有代码加上while循环,从而实验多次域名的输入5编译,调试,运行程序,检验程序运行结果6思考,分析实验结果,编写实验报告实验编译及链接错误无解决方案:无
2.实验步骤如下1建立名为LocalHostlnfo的一个C++程序工程,并建立同名的文件;2将教材上获取本机ip地址,子网掩码,网关ip和本机MAC地址代码录入;3编译,调试,运行程序,检验程序运行结果4思考,分析实验结果,编写实验报告实验编译及链接错误无解决方案:无
四、讨论与分析Winsock初始化的作用是什么?答:作用是为了式程序能够使用一些底层的API函数,用来完成功能2给出GetAdaptersInfo函数的正确使用方法DWORDGetAdaptersInfoPIP_ADAPTER_INFOpAdapterlnfo〃指向一个缓冲区,用来取得IP_ADAPTER_INFO结构的表PULONGpOutBufLen//用来指定上面的缓冲区的大小,如果大小不够,此参数返回所需大小〃函数调用成功返回ERROR_SUCCESS3域名解析时出现域名对应多个IP请解释原因因为一台主机上可能会对应多个IP地址如笔记本上的无线网卡上对应了一个IP地址而在有线上也对应了一个IP地址
五、实验者自评主要从实验态度、方法、效果上给一个客观公正的自我评价这次实验使我对书本上的知识有了更深的理解,对于这些重要的API函数的调用也有了一个更加明确的理解,除此之外,我还对套接字、端口、IP地址之间的关系有了初步的理解.
三、附录关键代码给出适当注释,可读性高
1、IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII//GetAllIps.cpp文件//#includen../common/InitSock.hn#includewinsock
2.h#includestdio.h#pragmacommentlibnWS2_32n//链接到WS2_
32.1ib//CInitSockinitSock;//初始化Winsock库voidmaincharszHost
[256]={nwww.
163.com};//取得本地主机名称charszMessage
[256];char*szHostl;WSADATAwsaData;BYTEminorVer=2;BYTEmajorVer=2;WORDsockVersion=MAKEWORDminorVermajorVer;if::WSAStartupsockVersionwsaData!=0exitO;//::gethostnameszHost256;//通过主机名得到地址信息〃szHost={www.
163.comn};printfC命令;getsszMessage;//szHost1=szMessage
[6];szHostl=szMessage;hostent*pHost=::gethostbynameszHostl;//打印出所有IP地址in_addraddr;forinti=0;;i++char*p=pHost-h_addr_list[i];ifp==NULLbreak;memcpyaddr.S_un.S_addrppHost-h_length;char*szlp=::inet_ntoaaddr;//printfn本机IP地址:%s\nnszlp;printfn服务器%sIP地址%s\nHszHostlszlp;printf服务器名字%s\nnpHost-h_name;lllllllllllllllllllllllllll::WSACleanup;llllllllllllllllllllllllllllllllllllllllllllllllll//Getsockopt.cpp:Definestheentrypointfortheconsoleapplication.#includenstdafx.hn#includestdlib.h#includestdio.h#includenwinsock
2.h#pragmacommentlibHWS2_
32.1ibHintmainintargcchar*argv[]〃用于初始化WindowsSockets环境//用于侦听的套接字//服务器地址////初始化WinsockintiResult=WSAStartupMAKEWORD22wsaData;ifiResult!=NO.ERRORprintfnErroratWSAStartup\nH;////创建侦听套接字ListenSocket=socketAFJNETSOCK_STREAMIPPROTO.TCP;ifListcnSockct==INVALID.SOCKET{printfCErroratsocket\nn;WSACleanupO;return-1;////将套接字绑定到本地的27015端口//andport27015hostent*thisHost;char*ip;u_shortport;port=27015;thisHost=gethostbynamenn;ip=inet_ntoa/structin_addr**thisHost-h_addr_list;service.sin_family=AF_INET;service.sin_addr.s_addr=inet_addrip;service.sin_port=htonsport;ifbindListenSocketSOCKADDR*servicesizeofserviceSOCKET_ERROR{printfbindfailedn;closesocketListenSocket;return-1;////调用getsockopt获取SO_ACCEPTCONN参数值intoptVai;intoptLen=sizeofint;ifgetsockoptListenSocketSOL_SOCKETSO_ACCEPTCONNchar*optValoptLen!=SOCKET_ERRORprintfnSockOptValue:%ld\n\optVai;////启动侦听模式iflistenListenSocket100==SOCKET_ERROR{printfnerrorlistening\nn;////在侦听模式下调用gctsockopt,获取SCLACCEPTCONN参数值ifgetsockoptListenSocketSOL_SOCKETSO_ACCEPTCONNchar*optValoptLen!=SOCKET_ERRORprintfCSockOptValue:%ld\nnoptVal;WSACleanupQ;systemnpausen;return0;。
个人认证
优秀文档
获得点赞 0