温馨提示×

Ubuntu C++如何配置网络设置

小樊
37
2025-11-23 11:52:12
栏目: 编程语言

Ubuntu C++网络设置与编程实践

一、系统级网络配置

  • 使用 NetworkManager 的命令行工具 nmcli(适合桌面/服务器统一管理)
    • 查看连接与设备:nmcli connection show;nmcli device wifi list
    • 连接 Wi‑Fi:nmcli device wifi connect password
    • 配置静态 IPv4:nmcli connection modify ipv4.method manual ipv4.addresses 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.dns “8.8.8.8”;nmcli connection up
  • 使用文本界面 nmtui(无需图形界面)
    • 启动:nmtui → Edit a connection → 选择网卡 → IPv4 Configuration 选 Manual → 填写地址/网关/DNS → Save → Activate
  • 使用 netplan(Ubuntu 18.04+ 常见,服务器/云镜像常用)
    • 编辑配置:sudo nano /etc/netplan/*.yaml(如 01-network-manager-all.yaml50-cloud-init.yaml
    • 示例(静态地址):
      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]
      
    • 应用:sudo netplan apply(远程环境建议先备好控制台/带外,避免断连)
  • 不建议的方式
    • 传统的 ifconfig/route 已不推荐;/etc/resolv.conf 可能被系统服务覆盖,直接改并非持久方案。

二、在 C++ 中实现网络连接

  • 安装基础开发环境
    • sudo apt-get update && sudo apt-get install build-essential(如需工程管理可再装 cmake
  • TCP 回显示例(最小可运行骨架)
    • 服务端 server.cpp
      #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;
      }
      
    • 客户端 client.cpp
      #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;
      }
      
    • 编译与运行
      • g++ -o server server.cpp && g++ -o client client.cpp
      • 终端1:./server;终端2:./client
  • 编译与工程化
    • 使用 CMake 管理多文件/多目标更方便(CMakeLists.txt 示例与构建流程可参考常规 C++ 网络工程实践)。

三、在 C++ 中修改系统网络配置

  • 适用场景与风险
    • 需要在程序内切换 静态/动态 IP网关DNS 等时,可通过生成或编辑 netplan 的 YAML 并调用 netplan apply 实现。此操作会改动系统网络,务必做好回滚与超时保护,生产环境建议先在测试环境验证。
  • 基本思路
    • 选择网卡名(如 eth0/ens33/enp0s3),读取 /etc/netplan/*.yaml,用 yaml-cpp 解析与修改:
      • 设置 dhcp4: noaddresses(如 “192.168.1.100/24”)
      • 配置默认路由:在 routes 中添加 { to: default, via: “192.168.1.1” }
      • 配置 nameservers.addresses(如 [“8.8.8.8”,“8.8.4.4”])
    • 写回文件后执行:sudo netplan apply(远程操作需确保有可靠回退通道)
  • 最小改造示例(基于 yaml-cpp,示意关键节点)
    #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
    
    • 依赖安装与构建
      • 获取并安装 yaml-cpp(git clone;mkdir build;cd build;sudo cmake -DBUILD_SHARED_LIBS=ON …;sudo make install)
      • 编译时链接 yaml-cpp(如 g++ your.cpp -lyaml-cpp)。

四、实践建议

  • 明确目标:若是编写网络应用,优先使用 Socket API 完成通信;若需改变主机网络参数,再考虑在 C++ 中生成/修改 netplan 配置并调用 netplan apply
  • 选择配置方式:桌面/混合环境优先 NetworkManager/nmcli;服务器/云镜像优先 netplan;避免使用已弃用的 ifconfig/route。
  • 安全与可回滚:涉及系统网络变更时,务必保留旧配置备份、支持一键回滚,并在可控窗口执行变更。
  • 接口与命名:网卡名在不同发行版/云平台可能为 eth0/ens33/enp0s3,操作前用 ip link 确认。

0