实验一Winsock编程接口实验.docx
《实验一Winsock编程接口实验.docx》由会员分享,可在线阅读,更多相关《实验一Winsock编程接口实验.docx(11页珍藏版)》请在冰豆网上搜索。
实验一Winsock编程接口实验
charFAR*FAR*h_aliases;
shorth_addrtype;
shorth_length;
charFAR*FAR*h_addr_list;
};
由于已知主机名(即输入的域名),所以只要调用该函数就能得到ip地址列表。
根据分析可得出程序流程图如下:
2、要得到本地主机的所有适配器的IP地址,子网掩码,默认网关,MAC地址等信息,主要是对GetAdaptersInfo()函数的理解和应用。
该函数可以获取本地主机的所有适配器信息,并保存在pAdapterInfo所指向的链表中。
函数原型为:
DWORDGetAdaptersInfo(
PIP_ADAPTER_INFOpAdapterInfo,//buffertoreceivedata
PULONGpOutBufLen//sizeofdatareturned
);
IP_ADAPTER_INFO的定义如下:
typedefstruct_IP_ADAPTER_INFO{
struct_IP_ADAPTER_INFO*Next;
DWORDComboIndex;
charAdapterName[MAX_ADAPTER_NAME_LENGTH+4];
charDescription[MAX_ADAPTER_DESCRIPTION_LENGTH+4];
UINTAddressLength;
BYTEAddress[MAX_ADAPTER_ADDRESS_LENGTH];
DWORDIndex;
UINTType;
UINTDhcpEnabled;
PIP_ADDR_STRINGCurrentIpAddress;
IP_ADDR_STRINGIpAddressList;
IP_ADDR_STRINGGatewayList;
IP_ADDR_STRINGDhcpServer;
BOOLHaveWins;
IP_ADDR_STRINGPrimaryWinsServer;
IP_ADDR_STRINGSecondaryWinsServer;
time_tLeaseObtained;
time_tLeaseExpires;
}IP_ADAPTER_INFO,*PIP_ADAPTER_INFO;
通过调用该函数就可以得到所有适配器信息。
流程图如下:
三、实验过程(包含实验结果)
1.实验步骤如下:
(1)建立一个C++程序工程,并建立同名的C++文件;
(2)将教材上获取本机IP等信息代码输入;
(3)将:
:
gethostname(szHost,256)改为cout<<”请输入主机名”<>szHost;
(4)为主函数中的所有代码加上while循环,从而实验多次域名的输入。
(5)编译,调试,运行程序,检验程序运行结果。
(6)思考,分析实验结果,编写实验报告。
实验编译及链接错误:
无。
解决方案:
无。
实验结果:
如下截图结果
2.实验步骤如下:
(1)建立名为LocalHostInfo的一个C++程序工程,并建立同名的文件;
(2)将教材上获取本机ip地址,子网掩码,网关ip和本机MAC地址代码录入;
(3)编译,调试,运行程序,检验程序运行结果。
(4)思考,分析实验结果,编写实验报告。
实验编译及链接错误:
无。
解决方案:
无。
实验结果:
如下截图为运行程序后的结果:
四、讨论与分析
1)Winsock初始化的作用是什么?
答:
作用是为了式程序能够使用一些底层的API函数,用来完成功能
2)给出GetAdaptersInfo()函数的正确使用方法
DWORDGetAdaptersInfo(PIP_ADAPTER_INFOpAdapterInfo,//指向一个缓冲区,用来取得IP_ADAPTER_INFO结构的列表
PULONGpOutBufLen//用来指定上面的缓冲区的大小,如果大小不够,此参数返回所需大小
)//函数调用成功返回ERROR_SUCCESS
3)域名解析时出现域名对应多个IP,请解释原因。
因为一台主机上可能会对应多个IP地址如(笔记本上的无线网卡上对应了一个IP地址而在有线上也对应了一个IP地址)
五、实验者自评(从实验设计、实验过程、对实验知识点的理解上给出客观公正的自我评价)
这次实验使我对书本上的知识有了更深的理解,对于这些重要的API函数的调用也有了一个更加明确的理解,除此之外,我还对套接字、端口、IP地址之间的关系有了初步的理解,
在以后的实验中,我会更加对书上的代码进行研究,充分的理解其中的关键要素!
六、附录:
关键代码(给出适当注释,可读性高)
#include
#include
#pragmacomment(lib,"WS2_32")
classCInitSock
{
public:
CInitSock(BYTEminorVer=2,BYTEmajorVer=2)
{
//初始化Winsock
WSADATAwsaData;
WORDsockVersion=MAKEWORD(minorVer,majorVer);
if(:
:
WSAStartup(sockVersion,&wsaData)!
=0)
{
exit(0);//初始化失败,退出程序
}
}
~CInitSock()
{
:
:
WSACleanup();//释放Winsock资源
}
};
intmain(intargc,char**argv)
{
CInitSockinitSock;
charszHost[256];
while(printf("输入域名:
"))
{
//通过域名得到地址信息
scanf("%s",&szHost);
if(szHost==0)
{
break;
}
hostent*pHost=:
:
gethostbyname(szHost);
//打印出所有IP地址
in_addraddr;
for(inti=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("IP地址:
%s\n",szIp);
}
}
printf("\n");
return0;
}
#include
#include
#include"Iphlpapi.h"
#pragmacomment(lib,"Iphlpapi.lib")
#pragmacomment(lib,"WS2_32.lib")
/////////////////////////////////////////
//全局数据
u_charg_ucLocalMac[6];//本地MAC地址
DWORDg_dwGatewayIP;//网关IP地址
////////////////////
DWORDg_dwGatewayIP1;
DWORDg_dwLocalIP;//本地IP地址
DWORDg_dwMask;//子网掩码
char*szAdapterName;
char*szAdapterDescription;
BOOLGetGlobalData()
{
PIP_ADAPTER_INFOpAdapterInfo=NULL;
ULONGulLen=0;
//为适配器结构申请内存
:
:
GetAdaptersInfo(pAdapterInfo,&ulLen);
pAdapterInfo=(PIP_ADAPTER_INFO):
:
GlobalAlloc(GPTR,ulLen);
//取得本地适配器结构信息
if(:
:
GetAdaptersInfo(pAdapterInfo,&ulLen)==ERROR_SUCCESS)
{
if(pAdapterInfo!
=NULL)
{
memcpy(g_ucLocalMac,pAdapterInfo->Address,6);
szAdapterName=pAdapterInfo->AdapterName;
szAdapterDescription=pAdapterInfo->Description;
g_dwGatewayIP=:
:
inet_addr(pAdapterInfo->GatewayList.IpAddress.String);
g_dwLocalIP=:
:
inet_addr(pAdapterInfo->IpAddressList.IpAddress.String);
g_dwMask=:
:
inet_addr(pAdapterInfo->IpAddressList.IpMask.String);
g_dwGatewayIP1=:
:
inet_addr(pAdapterInfo->Next->IpAddressList.IpAddress.String);
}
}
printf("\n--------------------本地主机信息-----------------------\n\n");
in_addrin;
in.S_un.S_addr=g_dwLocalIP;
in_addrin1;
in1.S_un.S_addr=g_dwGatewayIP1;
printf("IPAddress:
%s\n",:
:
inet_ntoa(in));
in.S_un.S_addr=g_dwMask;
printf("SubnetMask:
%s\n",:
:
inet_ntoa(in));
in.S_un.S_addr=g_dwGatewayIP;
printf("DefaultGateway:
%s\n",:
:
inet_ntoa(in));
u_char*p=g_ucLocalMac;
printf("MACAddress:
%02X-%02X-%02X-%02X-%02X-%02X\n",p[0],p[1],p[2],p[3],p[4],p[5]);
printf("适配器名称:
%s\n",szAdapterName);
printf("适配器描述:
%s\n",szAdapterDescription);
/////////////////////////////
printf("有线适配器ip地址:
%s\n",inet_ntoa(in1));
printf("\n\n");
returnTRUE;
}
intmain()
{
//获取全局数据
GetGlobalData();
getchar();
return0;
}