网络信息获取函数应用实例
前言
本实例只使用了三个比较典型的函数,其他函数的用法也与此类似,要说明的是,虽然这只是一个关于网络信息获取函数用法的实例,但是该程序也是一个实用程序,它可以获得一台主机的主机名,主机别名(如果有的话),主机IP地址列表等信息
代码部分
#include<winsock2.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib, "ws2_32.lib")
void main()
{
WSADATA wsaData;
int n;
//存放主机名称
char hostname[256];
//主机信息指针
hostent* pHostent;
//主机协议信息指针
protoent* pProtoent;
struct sockaddr_in sa;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to load Winsock.\n ");
return;
}
printf("---------------------------------------------\n");
//获得主机名
if (gethostname(hostname, sizeof(hostname)) != 0)
{
printf("gethostname() Error: %u\n", WSAGetLastError());
return;
}
printf("以下信息由gethostname()函数取得\n");
printf("Local host name:%s\n", hostname);
printf("---------------------------------------------\n");
//根据主机名获取主机信息
pHostent = gethostbyname(hostname);
if (pHostent == NULL)
{
printf("gethostbyname() Error: %u\n", WSAGetLastError());
return;
}
//解析返回的hostent结构中名称、别名、地址类型和地址长度信息
printf("以下信息由gethostbyname()函数取得\n");
printf("name:%s\naliases:%s\naddrtype:%d\nlength:%d\n", pHostent->h_name, pHostent->h_aliases, pHostent->h_addrtype, pHostent->h_length);
//解析hostent结构中的主机地址
for (n = 0; pHostent->h_addr_list[n]; n++)
{
memcpy(&sa.sin_addr.s_addr, pHostent->h_addr_list[n], pHostent->h_length);
//输出主机IP地址.
printf("Address: %s\n", inet_ntoa(sa.sin_addr));
}
printf("---------------------------------------------\n");
//根据协议名获得协议信息
pProtoent = getprotobyname("tcp");
if (pProtoent == NULL)
{
printf("getprotobyname() Error: %u\n", WSAGetLastError());
return;
}
//解析protoent结构中的信息
printf("以下信息由getprotobyname()函数取得\n");
printf("name:%s\nproto:%d\n", pProtoent->p_name, pProtoent->p_proto);
for (n = 0; pProtoent->p_aliases[n]; n++)
{
printf("aliases: %s\n", pProtoent->p_aliases[n]);
}
WSACleanup();
}
结果图
注意事项
由于我是用vs写代码的,所以有编译环境的问题存在,如果出现了以下报错请在预处理器上添加代码
_WINSOCK_DEPRECATED_NO_WARNINGS
结语
如果有什么问题的话可以在评论区或者私信问我,可能我也不会(bushi)