网络信息获取函数应用实例 | 网络编程

发布于 2021-07-10  22 次阅读


前言

本实例只使用了三个比较典型的函数,其他函数的用法也与此类似,要说明的是,虽然这只是一个关于网络信息获取函数用法的实例,但是该程序也是一个实用程序,它可以获得一台主机的主机名,主机别名(如果有的话),主机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)