实验一 实验报告
- 格式:doc
- 大小:44.05 KB
- 文档页数:6
网络程序设计实验报告实验名称:Winsock编程接口实验实验类型:验证型一、实验目的●掌握Winsock的启动和初始化;●掌握gethostname(),gethostbyname(),GetAdaptersInfo()等信息查询函数的使用。
二、实验设计实验内容:1、编写程序能同时实现对多个域名的解析。
比如在控制台输入:getip ,能输出和对应的IP地址列表。
2、编写程序获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC 地址。
根据实验内容编写程序:1、对相关域名进行解析,利用gethostbyname()完成解析,用到的结构体为:struct hostent{char FAR* h_name;char FAR* FAR* h_aliases;short h_addrtype;short h_length;char FAR* FAR* h_addr_list;}得到的IP地址列表由h_addr_list存储;2、利用GetAdaptersInfo()函数获得本地主机的相关信息,通过IP_ADAPTER_INFO 结构体返回所需信息。
IP_ADAPTER_INFO的定义如下:typedef struct _IP_ADAPTER_INFO {struct _IP_ADAPTER_INFO* Next;DWORD ComboIndex;char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];UINT AddressLength;BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];DWORD Index;UINT Type;UINT DhcpEnabled;PIP_ADDR_STRING CurrentIpAddress;IP_ADDR_STRING IpAddressList;IP_ADDR_STRING GatewayList;IP_ADDR_STRING DhcpServer;BOOL HaveWins;IP_ADDR_STRING PrimaryWinsServer;IP_ADDR_STRING SecondaryWinsServer;time_t LeaseObtained;time_t LeaseExpires;} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;三、实验过程(包含实验结果)1、分析题目,编写程序;2、将编写的程序进行编译、运行,输入题目给定的内容,完成题目要求;结果如下:第1题:第2题:四、讨论与分析思考题:1、Winsock初始化的作用:只有调用了WSAStartup()进行初始化之后,应用程序才能调用其他Windows Sockets API函数,实现网络通信;2、函数原型为:DWORD GetAdaptersInfo(PIP_ADAPTER_INFO pAdapterInfo, //接受数据的缓冲区PULONG pOutBufLen // 数据的长度大小);3、域名解析时出现域名对应多个IP,原因:该域名存在于多个服务器。
五、实验者自评通过本次实验,我掌握了Winsock的启动和初始化以及gethostname(),gethostbyname(),GetAdaptersInfo()等函数查询的使用,加深了以前对课本知识的认识程度。
六、附录:关键代码(给出适当注释,可读性高)第1题代码://////////////////////////////////////////////////// GetAllIps.cpp文件//#include "../common/InitSock.h"#include <winsock2.h>#include <iostream>#include <stdio.h>using namespace std;#pragma comment(lib, "WS2_32") // 链接到WS2_32.lib//CInitSock initSock; // 初始化Winsock库void main(){char szMessage[256]; // 取得本地主机名称// 初始化WSADATA wsaData;if(WSAStartup(MAKEWORD(2,2), &wsaData) != 0){exit(0);}// 通过主机名得到地址信息printf(" Get IP::");gets(szMessage);// 获取主机信息hostent *pHost = ::gethostbyname(szMessage);// 打印出所有IP地址in_addr addr;for(int i = 0; ; i++){char *p = pHost->h_addr_list[i];if(p == NULL)break;memcpy(&addr.S_un.S_addr, p, pHost->h_length);char *szIp = ::inet_ntoa(addr);printf(" 服务器%s IP地址:%s \n ",szMessage, szIp);printf("服务器名字:%s \n",pHost->h_name );}///////////////////////////::WSACleanup();}第2题代码:// 获取并输出本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址#include <winsock2.h>#include <iostream>using namespace std;#include <iphlpapi.h>#pragma comment(lib, "IPHLPAPI.lib")void main(){// 定义变量IP_ADAPTER_INFO *pAdapterInfo;ULONG ulOutBufLen;DWORD dwRetVal;PIP_ADAPTER_INFO pAdapter;pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO));ulOutBufLen = sizeof(IP_ADAPTER_INFO);// 第一次获取适配器信息,得到ulOutBufLen的实际大小if(GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS){free(pAdapterInfo);pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen);}// 第二次获取适配器信息,获得了pAdapterInfo信息if(dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) != ERROR_SUCCESS) {cout<<"GetAdapterInfo Error!"<<dwRetVal<<endl;}// 打印MAC地址信息、子网掩码以及网关pAdapter = pAdapterInfo;while(pAdapter){cout<<"MAC Address: ";for(int i=0; i<pAdapter->AddressLength; i++){if(i == (pAdapter->AddressLength - 1)){cout<<hex<<(int)pAdapter->Address[i];}else{cout<<hex<<(int)pAdapter->Address[i]<<"-";}}cout<<endl;cout<<"IP 地址:"<<pAdapter->IpAddressList.IpAddress.String<<endl;cout<<"子网掩码:"<<pAdapter->IpAddressList.IpMask.String<<endl;cout<<"网关:"<<pAdapter->IpAddressList.IpAddress.String<<endl;cout<<"****************************************"<<endl;pAdapter = pAdapter->Next;}// 释放资源if(pAdapterInfo){free(pAdapterInfo);}cout<<endl;system("pause");}。