在 Linux 下用 C++ 配置网络,常见做法有几种,取决于你想做到什么程度。下面从「常用 → 偏底层」给你一个系统性的说明,并附上示例。
ip / ifconfig / route 等命令(最简单)适合:快速实现、不追求性能、非底层开发
#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;
}
✅ 优点
❌ 缺点
ioctl(传统 C 风格,偏底层)适合:老代码、嵌入式、不需要复杂功能
ioctl 配置 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;
}
⚠️ 注意
适合:真正的网络配置程序、守护进程、系统工具
Netlink 是 Linux 内核用于用户态与网络子系统通信的接口。
常见用途:
✅ 官方推荐
✅ 功能最全
❌ 代码复杂
NETLINK_ROUTE socketrtnl 消息手写 Netlink 非常麻烦,一般用封装库
示例(添加 IP):
#include <netlink/netlink.h>
#include <netlink/route/addr.h>
功能:
✅ 适合企业级程序
❌ 依赖库
/etc/netplan/*.yaml/etc/sysconfig/network-scripts/NetworkManagerC++ 里:
std::ofstream ofs("/etc/netplan/01-netcfg.yaml");
ofs << R"(...)";
system("netplan apply");
sudo ./your_program
Operation not permittedNo such device| 场景 | 推荐方式 |
|---|---|
| 快速实现 | system + ip |
| 嵌入式 | ioctl |
| 系统服务 | Netlink / libnl |
| 配置管理 | 修改配置文件 |
你可以告诉我:
我可以直接给你可编译的完整示例。