现代c++获取linux系统指定网络接口的ip地址
现代c++获取linux系统指定网络接口的ip地址
- 前言
- 一、使用命令查看
- 二、使用c++代码获取
- 三、验证
- 四、完整代码如下
- 五、总结
前言
本文介绍一种使用c++获取指定网卡的ip地址的方法.
一、使用命令查看
在linux
系统中可以使用ifconfig
或者ip a
命令查看网络接口的ip
,如下图所示
二、使用c++代码获取
需要包含<ifaddrs.h>
,<sys/types.h>
,<arpa/inet>
头文件
写下如下图代码
#include <arpa/inet.h>
#include <array>
#include <cstring>
#include <ifaddrs.h>
#include <string>
#include <iostream>
#include <sys/types.h>std::string getIpAddressByInterfaceName(const std::string &name) {std::string ip{};struct ifaddrs *ifaddr = nullptr;if (auto ret = getifaddrs(&ifaddr); ret == -1) {std::cout << "getifaddrs error: " << strerror(ret) << std::endl;return ip;}for (auto *ifa = ifaddr; ifa; ifa = ifa->ifa_next) {if (!ifa->ifa_addr) {continue;}if (ifa->ifa_addr->sa_family != AF_INET) {continue;}if (ifa->ifa_name && ifa->ifa_name == name) {std::array<char, INET_ADDRSTRLEN> addr;ip = inet_ntop(AF_INET, &((reinterpret_cast<struct sockaddr_in *>(ifa->ifa_addr))->sin_addr), addr.data(), INET_ADDRSTRLEN);break;}}freeifaddrs(ifaddr);return ip;
}
三、验证
在main.cpp
的main
函数中写下如下代码
int main(int argc, char **argv) {std::cout << getIpAddressByInterfaceName("ens33") << std::endl;return 0;
}
编译并执行,g++ main.cpp -o main && ./main
,执行结果如下
可以获取到ip
四、完整代码如下
#include <arpa/inet.h>
#include <array>
#include <cstring>
#include <ifaddrs.h>
#include <iostream>
#include <string>
#include <sys/types.h>std::string getIpAddressByInterfaceName(const std::string &name) {std::string ip{};struct ifaddrs *ifaddr = nullptr;if (auto ret = getifaddrs(&ifaddr); ret == -1) {std::cout << "getifaddrs error: " << strerror(ret) << std::endl;return ip;}for (auto *ifa = ifaddr; ifa; ifa = ifa->ifa_next) {if (!ifa->ifa_addr) {continue;}if (ifa->ifa_addr->sa_family != AF_INET) {continue;}if (ifa->ifa_name && ifa->ifa_name == name) {std::array<char, INET_ADDRSTRLEN> addr;ip = inet_ntop(AF_INET, &((reinterpret_cast<struct sockaddr_in *>(ifa->ifa_addr))->sin_addr), addr.data(), INET_ADDRSTRLEN);break;}}freeifaddrs(ifaddr);return ip;
}int main(int argc, char **argv) {std::cout << getIpAddressByInterfaceName("ens33") << std::endl;return 0;
}
五、总结
通过上诉c++方法,确实可以获取到指定网卡的ip,亲测可用!!!