在 Linux 下用 C++ 配置网络,常见方式有三种,取决于你想“配置到什么程度”。下面按从常见到偏底层给你一个清晰说明,并附示例。
Linux 网络配置通常由 ip、ifconfig、route 等命令完成,
C++ 程序可以直接调用它们。
system() 配置 IP#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");
// 设置 DNS(写入 resolv.conf)
system("echo 'nameserver 8.8.8.8' > /etc/resolv.conf");
return 0;
}
✅ 优点
⚠️ 注意
system() 安全性一般(适合内部工具)exec 系列函数(比 system 更专业)比 system() 更可控,不依赖 shell。
#include <unistd.h>
#include <iostream>
int main() {
pid_t pid = fork();
if (pid == 0) {
// 子进程执行 ip 命令
execl("/usr/bin/ip", "ip", "addr", "add",
"192.168.1.100/24", "dev", "eth0", nullptr);
}
return 0;
}
✅ 适合:
如果你想像 ip 命令一样直接配置内核网络,
需要使用 Netlink(NETLINK_ROUTE)。
AF_NETLINK socketrtnetlink 消息#include <sys/socket.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <arpa/inet.h>
#include <string.h>
#include <iostream>
int main() {
int sock = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
if (sock < 0) {
perror("socket");
return 1;
}
sockaddr_nl sa{};
sa.nl_family = AF_NETLINK;
if (bind(sock, (sockaddr*)&sa, sizeof(sa)) < 0) {
perror("bind");
return 1;
}
std::cout << "Netlink socket created\n";
close(sock);
return 0;
}
⚠️ 注意
ifaddrmsg、rtmsg 等结构体man 7 rtnetlink| 配置内容 | 推荐方式 |
|---|---|
| 设置 IP | ip addr add |
| 启停网卡 | ip link set |
| 路由 | ip route |
| DNS | 写 /etc/resolv.conf |
| 防火墙 | iptables / nftables |
| 高级网络 | Netlink |
g++ netconfig.cpp -o netconfig
sudo ./netconfig
✅ 初学者 / 应用层程序
→ 用方式一或二(调用命令)
✅ 系统级 / 网络工具
→ 用 Netlink
如果你愿意,可以告诉我:
我可以直接给你完整可运行代码。