温馨提示×

Linux C++怎么配置网络

小樊
36
2026-08-27 06:50:06
栏目: 编程语言

在 Linux 下用 C++ 配置网络,常见需求有几种,不同场景做法不一样。下面按从简单到底层给你一个清晰说明,并附示例。


一、最常用:调用系统命令(简单、推荐)

如果只是配置 IP、路由、DNS,最简单可靠的方式是调用 ipifconfigroute 等命令。

示例:用 C++ 设置 IP 地址

#include <cstdlib>

int main() {
    system("ip addr add 192.168.1.100/24 dev eth0");
    system("ip link set eth0 up");
    return 0;
}

✅ 适合:

  • 程序启动配置网络
  • 不需要实时管理网络状态

⚠ 注意:

  • 需要 root 权限
  • 不建议频繁调用

二、使用 glibc / POSIX Socket API(编程方式)

适合 网络通信编程,不是“配置网络接口”。

1️⃣ 创建 socket

#include <sys/socket.h>
#include <arpa/inet.h>

int sock = socket(AF_INET, SOCK_STREAM, 0);

2️⃣ 绑定 IP 和端口

struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "192.168.1.100", &addr.sin_addr);

bind(sock, (struct sockaddr*)&addr, sizeof(addr));

✅ 适合:

  • 写服务器 / 客户端
  • TCP / UDP 通信

❌ 不适合:

  • 配置网卡 IP、网关、DNS

三、使用 ioctl(配置网卡参数,偏底层)

可以设置 IP、子网掩码、MAC 等。

示例:设置 IP 地址

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

int main() {
    int fd = socket(AF_INET, SOCK_DGRAM, 0);
    struct ifreq ifr{};

    strcpy(ifr.ifr_name, "eth0");

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

    ioctl(fd, SIOCSIFADDR, &ifr);
    close(fd);
}

✅ 适合:

  • 嵌入式 Linux
  • 自定义网络管理程序

❌ 缺点:

  • API 老旧
  • 不支持 IPv6 很好
  • 代码复杂

四、使用 Netlink(现代、推荐,偏高级)

netlink 是 Linux 内核官方推荐方式,用于网络配置、路由、防火墙

✅ 功能最强
❌ 学习成本高

常见用途

  • 添加 / 删除 IP
  • 配置路由
  • 监听网络变化

示例(概念)

#include <linux/netlink.h>
#include <linux/rtnetlink.h>

一般配合 libnl 使用:

sudo apt install libnl-3-dev libnl-route-3-dev

五、配置 DNS(特殊说明)

Linux DNS 通常配置在:

/etc/resolv.conf

C++ 写 DNS

#include <fstream>

std::ofstream resolv("/etc/resolv.conf");
resolv << "nameserver 8.8.8.8\n";

⚠ 注意:

  • systemd / NetworkManager 可能会覆盖它
  • 推荐用 systemd-resolved

六、推荐方案总结

需求 推荐方式
设置 IP / 网关 system("ip ...")
网络通信 socket
嵌入式配置网卡 ioctl
专业网络管理 Netlink / libnl
配置 DNS /etc/resolv.conf

七、你可能真正想问的是?

你可以告诉我:

  1. ✅ 是 配置网卡 IP / 网关 / DNS
  2. ✅ 还是 写网络服务器 / 客户端
  3. ✅ 是 桌面 Linux / 服务器 / 嵌入式
  4. ✅ 用不用 systemd / NetworkManager

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

0