Ubuntu C++网络设置与编程实践
一、系统级网络配置
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
二、在 C++ 中实现网络连接
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0);
int opt = 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt));
sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(8080);
bind(server_fd, (sockaddr*)&addr, sizeof(addr));
listen(server_fd, 3);
sockaddr_in cli{}; socklen_t len = sizeof(cli);
int cli_fd = accept(server_fd, (sockaddr*)&cli, &len);
char buf[1024] = {0};
read(cli_fd, buf, sizeof(buf)-1);
std::cout << "recv: " << buf << '\n';
send(cli_fd, "Hello from server", 17, 0);
close(cli_fd); close(server_fd);
return 0;
}
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in serv{};
serv.sin_family = AF_INET;
serv.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr);
connect(sock, (sockaddr*)&serv, sizeof(serv));
send(sock, "Hello from client", 17, 0);
char buf[1024] = {0};
read(sock, buf, sizeof(buf)-1);
std::cout << "resp: " << buf << '\n';
close(sock);
return 0;
}
三、在 C++ 中修改系统网络配置
#include <yaml-cpp/yaml.h>
#include <fstream>
void set_static(const std::string& iface,
const std::string& addr, const std::string& gw,
const std::vector<std::string>& dns) {
std::string file = "/etc/netplan/01-network-manager-all.yaml"; // 视实际文件名调整
YAML::Node cfg = YAML::LoadFile(file);
auto& eth = cfg["network"]["ethernets"][iface];
eth["dhcp4"] = "no";
eth["addresses"] = std::vector<std::string>{addr};
eth["routes"] = std::vector<YAML::Node>{YAML::Node()};
eth["routes"][0]["to"] = "default";
eth["routes"][0]["via"] = gw;
eth["nameservers"]["addresses"] = dns;
std::ofstream out(file);
out << cfg;
}
// 调用示例:set_static("eth0", "192.168.1.100/24", "192.168.1.1", {"8.8.8.8","8.8.4.4"});
// 然后执行:sudo netplan apply
四、实践建议