現代c++獲取linux所有的網絡接口名稱
- 前言
- 一、在linux中查看網絡接口名稱
- 二、使用c++代碼獲取
- 三、驗證
- 四、完整代碼如下
- 五、總結
前言
本文介紹一種使用c++獲取本地所有網絡接口名稱的方法。
一、在linux中查看網絡接口名稱
在linux
系統中可以使用ifconfig -a
命令列舉出本機所有網絡接口。如下圖所示
也可以使用ip a
命令,如下圖所示
二、使用c++代碼獲取
需要包含<ifaddrs.h>
,<sys/types.h>
頭文件
寫下如下圖代碼
#include <string>
#include <sys/types.h>
#include <vector>
#include <ifaddrs.h>std::vector<std::string> interfaceNames() {std::vector<std::string> names;struct ifaddrs *ifaddr{nullptr};if (getifaddrs(&ifaddr) == 0) {for (auto ifa = ifaddr; ifa; ifa = ifa->ifa_next) {if (ifa->ifa_addr->sa_family == AF_PACKET) {names.push_back(ifa->ifa_name);}}freeifaddrs(ifaddr);}return names;
}
為了打印方便,我們重載一下左移運算符
std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {os << "[";for (auto &s : v) {os << s;if (&s != &v.back()) {os << ",";}}return os << "]";
}
三、驗證
在main.cpp
的main
函數中寫下如下代碼
int main(int argc, char **argv) {std::cout << interfaceNames() << std::endl;return 0;
}
編譯并驗證,g++ main.cpp -o main && ./main
,結果如下
確實可以獲取到接口名稱。
四、完整代碼如下
#include <ifaddrs.h>
#include <iostream>
#include <string>
#include <sys/types.h>
#include <vector>std::vector<std::string> interfaceNames() {std::vector<std::string> names;struct ifaddrs *ifaddr{nullptr};if (getifaddrs(&ifaddr) == 0) {for (auto ifa = ifaddr; ifa; ifa = ifa->ifa_next) {if (ifa->ifa_addr->sa_family == AF_PACKET) {names.push_back(ifa->ifa_name);}}freeifaddrs(ifaddr);}return names;
}std::ostream &operator<<(std::ostream &os, const std::vector<std::string> &v) {os << "[";for (auto &s : v) {os << s;if (&s != &v.back()) {os << ",";}}return os << "]";
}int main(int argc, char **argv) {std::cout << interfaceNames() << std::endl;return 0;
}
五、總結
本文介紹了一種使用c++獲取本地所有網絡接口的方法,親測可用!!!