温馨提示×

Linux C++配置网络怎么做

小樊
45
2026-07-31 18:10:49
栏目: 编程语言

在 Linux 下用 C++ 配置网络,常见做法有几种,取决于你想做到什么程度。下面从「常用 → 偏底层」给你一个系统性的说明,并附上示例。


一、最推荐方式(执行系统命令)

1️⃣ 调用 ip / ifconfig / route 等命令(最简单)

适合:快速实现、不追求性能、非底层开发

示例代码(system / popen)

#include <cstdlib>
#include <iostream>

int main() {
    // 设置 IP 地址
    system("ip addr add 192.168.1.100/24 dev eth0");

    // 启动网卡
    system("ip link set eth0 up");

    // 设置默认网关
    system("ip route add default via 192.168.1.1");

    return 0;
}

✅ 优点

  • 简单
  • 和手动敲命令一致

❌ 缺点

  • 不适合高可靠性程序
  • system() 不安全(命令注入风险)

二、使用 ioctl(传统 C 风格,偏底层)

适合:老代码、嵌入式、不需要复杂功能

2️⃣ 使用 ioctl 配置 IP / 子网掩码

设置 IP 地址示例

#include <iostream>
#include <string>
#include <cstring>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <unistd.h>

bool setIp(const std::string& ifname, const std::string& ip) {
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    if (fd < 0) return false;

    struct ifreq ifr{};
    strcpy(ifr.ifr_name, ifname.c_str());

    struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
    addr->sin_family = AF_INET;
    inet_pton(AF_INET, ip.c_str(), &addr->sin_addr);

    if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
        close(fd);
        return false;
    }

    close(fd);
    return true;
}

⚠️ 注意

  • 需要 root 权限
  • 只能配置基础参数(IP、掩码、MTU)
  • 不能配置路由表

三、使用 Netlink(现代、专业方式 ✅)

适合:真正的网络配置程序、守护进程、系统工具

3️⃣ Netlink(内核推荐接口)

Netlink 是 Linux 内核用于用户态与网络子系统通信的接口。

常见用途:

  • 增删网络接口
  • 配置 IP
  • 配置路由
  • 监听网络变化

特点

✅ 官方推荐
✅ 功能最全
❌ 代码复杂

基本流程

  1. 创建 NETLINK_ROUTE socket
  2. 构造 rtnl 消息
  3. 发给内核
  4. 解析返回结果

手写 Netlink 非常麻烦,一般用封装库


四、使用第三方库(强烈推荐)

4️⃣ libnl / libnl-route(专业级)

示例(添加 IP):

#include <netlink/netlink.h>
#include <netlink/route/addr.h>

功能:

  • 配置 IP / route / link
  • 监听网络事件
  • 支持 IPv6

✅ 适合企业级程序
❌ 依赖库


五、如果你只是想改配置文件(服务器场景)

5️⃣ 直接修改配置

  • Debian / Ubuntu:/etc/netplan/*.yaml
  • CentOS / RHEL:/etc/sysconfig/network-scripts/
  • 现代系统:NetworkManager

C++ 里:

std::ofstream ofs("/etc/netplan/01-netcfg.yaml");
ofs << R"(...)";
system("netplan apply");

六、权限与注意事项

✅ 必须 root 权限

sudo ./your_program

常见错误

  • Operation not permitted
  • No such device
  • 网卡未 up

七、如何选择?

场景 推荐方式
快速实现 system + ip
嵌入式 ioctl
系统服务 Netlink / libnl
配置管理 修改配置文件

八、我可以继续帮你

你可以告诉我:

  1. 目标系统(Ubuntu / CentOS / 嵌入式 Linux)
  2. 要配置什么(IP / 网关 / DNS / VLAN / 路由)
  3. 是否要实时监听网络变化

我可以直接给你可编译的完整示例

0