利用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;
}
关于结果
提示:给大家看看我们最后程序的运行结果
程序运行结果如下:

接着我们点开设备管理其对对答案:(不展示全部,都是搞网络的注意安全)
=。=~

1458

被折叠的 条评论
为什么被折叠?



