当前位置: 首页 > news >正文

现代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.cppmain函数中写下如下代码
在这里插入图片描述

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,亲测可用!!!

相关文章:

  • 数字化时代软件检测机构如何保障软件质量、安全与合规性?
  • 【Linux实践系列】:进程间通信:万字详解命名管道实现通信
  • NGINX ngx_http_addition_module 模块响应体前后注入内容
  • NVIDIA新模型DAM-3B:描述一切,图像视频局部描述新突破
  • vue3+ts+pinia+vite实战后台管理系统一(框架搭建和配置)
  • IBM Engineering Lifecycle Management 创建用户
  • 迈瑞医疗:国际业务增长21.28% 发展中国家成重要增长引擎
  • C语言中的指针详解
  • 单元测试总结
  • Vue3 项目中 Pinia 与 JavaScript 循环依赖问题深度解析
  • 【前缀和 差分数组 数论】P6042 「ACOI2020」学园祭|省选-
  • 经典数仓架构深度解析与演进:从离线处理到新型架构对比
  • 为什么执行了删除语句后mysql内存无变化?
  • 介绍下Nginx的作用与请求转发机制
  • 初识c++
  • 【Java学习笔记】克隆对象
  • 【HCIA】NAT Server
  • mysql约束
  • RocketMQ 存储核心:深入解析 CommitLog 设计原理
  • UARA串口开发基础
  • 路边“僵尸车”被人以1450元卖了,嫌疑人被刑拘
  • 新造古镇丨上海古镇朱家角一年接待164万境外游客,凭啥?
  • 王一博赛车故障退赛冲上热搜,工作室回应:下次再战
  • 马上评|演唱会云集,上海如何把“流量”变“留量”
  • 泰山景区管委会:未经审核同意不得擅自举办竞速类登山活动
  • 邮轮、无人机、水上运动……上海多区推动文旅商体展融合发展