前言
最近需要将网络设置功能集成到软件中,因此找了一些win api进行封装,由此实现对Windows的ip地址、子网掩码、默认网关、Dns等信息的获取和设置。
获取网卡信息
由于一个api不能获取全部所需信息,因此使用了两个api进行获取
获取网卡名、mac地址、ip地址、子网掩码、默认网关
{
/****获取网卡名、mac地址、ip地址、子网掩码、默认网关****/
//PIP_ADAPTER_INFO结构体指针存储本机网卡信息
PIP_ADAPTER_INFO adapter_info = new IP_ADAPTER_INFO();
PIP_ADAPTER_INFO adapter = nullptr;
unsigned long stSize = sizeof(IP_ADAPTER_INFO);
memset(adapter_info, 0, stSize);
//调用GetAdaptersInfo函数,填充pIpAdapterInfo指针变量;其中stSize参数既是一个输入量也是一个输出量
auto ret = GetAdaptersInfo(adapter_info, &stSize);
if (ERROR_BUFFER_OVERFLOW == ret) {
delete adapter_info;
adapter_info = (PIP_ADAPTER_INFO)new BYTE[stSize];
ret = GetAdaptersInfo(adapter_info, &stSize);
}
if (ERROR_SUCCESS == ret) {
// 可能有多网卡,因此通过循环去判断
adapter = adapter_info; // 保存链表头,等下需要释放空间
while (adapter) {
NetCardInfo info;
if (info.ParseInfo(adapter)) {
info_list.push_back(std::make_shared<NetCardInfo>(info)); // 转换成功才添加
}
adapter = adapter->Next;
}
}
//释放内存空间
if (adapter_info) {
delete adapter_info;
}
}
获取连接名和dns地址
{
/******************获取连接名和dns地址************************/
PIP_ADAPTER_ADDRESSES addresses = nullptr, cur_addresses = nullptr;
ULONG outBufLen = 15000; // Allocate a 15 KB buffer to start with.
ULONG Iterations = 0, ret = 0;
do {
addresses = (IP_ADAPTER_ADDRESSES *)new BYTE[outBufLen];
if (addresses != nullptr)