网络编程系列——查询本机IP

利用VS2022,查询本机IP:

使用Windows Sockets的API函数获得本机的IP地址

这里不再对我们所用的套接字函数过多赘述,为了获得我们自己本机的ip。我们需要掌握Windows Sockets DLL的初始化和释放方法的方法,并且了解初步的关于Windows Sockets API调用的一般步骤。

{喜欢的话 别忘记一键三联!希望对你有帮助!}

关于头文件部分

提示:这里就把所需要的头文件先分享给大家

#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#include <iostream>				//本人c++爱好者 勿喷

#define _WINSOCK_DEPRECATED_NO_WARNINGS		//不然会报错啦
#pragma comment(lib, "ws2_32.lib")

using namespace std;

关于main函数部分

提示:先把主函数给大伙看看

由于本人比较菜,实在不习惯利用属性里面的值来调试结果,感觉这样的写法对初学者更友好(因为我是初学者)

int main()
{
    WSADATA WinsockData;    //初始化

    if (WSAStartup(MAKEWORD(2, 2), &WinsockData) != 0) //头文件中,我们用的新版本2(2,2)
    {
        cout << "Failed to find " << endl;
        return 2;
    }

    int ip = get_your_ip();       //调用get_your_ip函数,查询自己的ip

    WSACleanup();       //别忘记了释放内存

    return ip;
}

关于get_your_ip()函数部分

提示:last but not least

是我们整个功能实现的最主要部分,这里也是利用了我们上课老师给的一部分代码,代价凑合看看,我们也是通过一个主要的循环过程不断地查询我们主机的IP。

这里还要解释一下,有的读者会好奇,我们的电脑为什么会有很多个IP地址。首先是因为由于大家现在的电脑都比较高端会有专门的WLAN网口,以及以太网网口,他们有不同的IP。其次,大家电脑里的虚拟机也需要网口接入,这导致我们的主机ip可能不止一个,但第一个查询到的ip一般就是正在上网所用到的IP。

int get_your_ip()
{
    SOCKET sd = WSASocket(AF_INET, SOCK_DGRAM, 0, 0, 0, 0);

    if (sd == SOCKET_ERROR) 
    {
        cout << "Failed to get a socket. Error " << WSAGetLastError() <<endl; 
        return 1;
    }

    INTERFACE_INFO InterfaceList[20];

    unsigned long nBytesReturned;

    if (WSAIoctl(sd, SIO_GET_INTERFACE_LIST, 0, 0, &InterfaceList, sizeof(InterfaceList), &nBytesReturned, 0, 0) == SOCKET_ERROR) 
    {
        cout << "Failed calling WSAIoctl: error " << WSAGetLastError() <<endl;
        return 1;
    }

    int nNumInterfaces = nBytesReturned / sizeof(INTERFACE_INFO);
    cout << "There are " << nNumInterfaces << " interfaces:" << endl;
    for (int i = 0; i < nNumInterfaces; ++i) 
    {
        cout << endl;

        sockaddr_in* pAddress;
        pAddress = (sockaddr_in*)&(InterfaceList[i].iiAddress);
        cout << " " << inet_ntoa(pAddress->sin_addr);

        pAddress = (sockaddr_in*)&(InterfaceList[i].iiBroadcastAddress);
        cout << " has bcast " << inet_ntoa(pAddress->sin_addr);

        pAddress = (sockaddr_in*)&(InterfaceList[i].iiNetmask);
        cout << " and netmask " << inet_ntoa(pAddress->sin_addr) << endl;

        cout << " Iface is ";

        u_long nFlags = InterfaceList[i].iiFlags;
        if (nFlags & IFF_UP) cout << "up";
        else                 cout << "down";
        if (nFlags & IFF_POINTTOPOINT) cout << ", is point-to-point";
        if (nFlags & IFF_LOOPBACK)     cout << ", is a loopback iface";
        cout << ", and can do: ";
        if (nFlags & IFF_BROADCAST) cout << "bcast ";
        if (nFlags & IFF_MULTICAST) cout << "multicast ";
        cout << endl;
    }
    return 0;
}

关于结果

提示:给大家看看我们最后程序的运行结果
程序运行结果如下:
在这里插入图片描述
接着我们点开设备管理其对对答案:(不展示全部,都是搞网络的注意安全)
=。=~
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值