当前位置:C++技术网 > 资讯 > 自动获取IP提高易用性含C++获取本机IP获取本机局域网IP的代码实现

自动获取IP提高易用性含C++获取本机IP获取本机局域网IP的代码实现

更新时间:2016-10-10 15:44:59浏览次数:1+次

    在开发服务器程序实现TCP监听的功能时,原先使用的是从配置文件读取设置的IP,然后启动TCP监听。不过,很多用户在使用的时候,并不知道如何设置IP,也不知道局域网IP是什么。这就让使用变得麻烦了。为了做好用户体验,让软件使用更加简单方便,还是加入自动获取局域网IP的功能。原先考虑到的是,让设置更加灵活,而不是依赖于自动获取。比如可以随意设置127.0.0.1本机地址测试,还可以设置192.168.*.*的局域网地址,还可以设置公网IP地址。甚至一个机器可能有多个IP地址,所以,设置可以更加灵活。所以才将设置交给了用户。只不过,对用户期望太高了,很多用户都是电脑小白,你懂的。
    所以,在使用简便和灵活中找到了一个平衡。以用户设置为主,以自动获取为辅,来平衡两者。当获取的设置为空或者设置错误时,就会启动自动获取IP。设置为空,为默认设置,使用户不必关注这个问题,针对懒用户或者小白用户。而设置错误是针对有电脑使用基础的用户,但是因为还是水平不到家,还是弄错了。所以,软件的目的不是去批评用户,而是去辅助用户使用软件,所以要自动去校正错误,并做提示。这样做,既是尊重用户,也是充分信任用户,而且,如果是熟练的用户,可以完全把握软件的设置,可以很灵活的在本机IP、多个局域网IP(多网卡)和公网IP中随意选择。
    所以,这个平衡可以满足所有的用户,让软件使用体验大大提升。好的软件应该做到这一点,在灵活和使用方便中寻找权衡点,而不是去指责用户不会用,也不是专注于软件灵活度。这是软件开发应该做好的一个基本原则。
    那么自动获取IP其实并不难。在文章《获取多网卡本地ip的方法》讲述了获取多个网卡信息的代码实现,而在《获取本机的机器名和IP地址》描述了获取IP的详细细节。但正如用户体验一样,这两篇文章侧重于讲述知识,所以代码没有写成函数,不能直接拿来就用,所以本文顺便将代码包装成一个函数,包括包含的头文件和lib文件都写在代码中,即使你不懂,也可以用的很顺利。

    如果你打印出多个IP地址,可能就是这样的:

自动获取IP提高易用性含C++获取本机IP获取本机局域网IP的代码实现

获取本机局域网IP代码:
#include <Winsock2.h>
#pragma comment(lib,"Ws2_32.lib")
char* GetLocalIP()             
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(1,1),&wsaData); 
    PHOSTENT hostinfo;
    char name[512] = {0};
    in_addr dest;
    char *ip=NULL;
    if(gethostname (name,sizeof(name)) != 0 || (hostinfo = gethostbyname(name)) == NULL)return NULL;
    for(int a=0; hostinfo->h_addr_list[a] != NULL ;a++)
    {
        //可以获取多个IP
        memcpy(&dest, hostinfo->h_addr_list[a], hostinfo->h_length);
        //打印多个IP
        //ip=inet_ntoa(dest);
        //printf("ip%d:%s\n",a,ip);
        //只取第一个局域网IP
        if (a==0)ip=inet_ntoa(dest);
    }
    WSACleanup();
    return ip;
}

    前面两行是头文件和lib文件的引用,必须有的。然后GetLocalIP就是一个完整的函数,可以直接在控制台程序和其他程序中使用。不过注意,这是Windows下的实现,不能在Linux中使用。
    在for循环中,我们注释部分可以打印多个IP地址。当然前提是你有多个IP地址。for循环里最后一句就是取第一个IP地址作为获取到的局域网IP地址。一个装有网卡的计算机,至少是有一个局域网IP的。所以取第一个也是最安全的。没有网卡的就不要说了。
    有人说,在获取的IP列表中会不会包含127.0.0.1呢?当然不会。127.0.0.1是本机回环测试地址,不需要网卡。任何一个计算机都有127.0.0.1。无需获取。