温馨提示×

Linux C++如何配置端口

小樊
42
2026-08-16 01:03:40
栏目: 编程语言

在 Linux 下用 C++ 配置/使用端口,通常指的是 网络编程(socket),而不是像 Windows 那样去“配置端口参数”。下面按最常见场景给你一个完整说明。


一、最基础:使用 socket 绑定端口(TCP 示例)

1️⃣ 基本流程

socket() → bind() → listen() → accept()

2️⃣ 示例代码(TCP Server)

#include <iostream>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>

int main() {
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (server_fd < 0) {
        perror("socket");
        return -1;
    }

    sockaddr_in addr{};
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8080);        // 端口号
    addr.sin_addr.s_addr = INADDR_ANY;  // 绑定所有网卡

    if (bind(server_fd, (sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("bind");
        return -1;
    }

    if (listen(server_fd, 10) < 0) {
        perror("listen");
        return -1;
    }

    std::cout << "Listening on port 8080..." << std::endl;

    int client_fd = accept(server_fd, nullptr, nullptr);
    if (client_fd >= 0) {
        std::cout << "Client connected" << std::endl;
        close(client_fd);
    }

    close(server_fd);
    return 0;
}

3️⃣ 编译

g++ server.cpp -o server

二、UDP 端口配置(无连接)

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

sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(9000);
addr.sin_addr.s_addr = INADDR_ANY;

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

三、常见端口配置问题

✅ 1. 端口被占用

bind: Address already in use

✅ 解决方式:

int opt = 1;
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

放在 bind() 前。


✅ 2. 端口号范围

  • 1–1023:需要 root 权限
  • 1024–65535:普通用户可用
sudo ./server

✅ 3. 防火墙问题(端口不通)

sudo ufw allow 8080
# 或
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

四、查看端口占用情况

netstat -tulnp | grep 8080
# 或
ss -lntp

五、客户端连接示例(C++)

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

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

connect(sock, (sockaddr*)&addr, sizeof(addr));

六、如果你指的是「串口端口」(不是网络端口)

如果你是 串口(/dev/ttyS0、USB 串口),那就不是 socket,而是:

open("/dev/ttyUSB0", O_RDWR | O_NOCTTY);

可以进一步告诉我你是:

  • ✅ 网络端口(TCP/UDP)
  • ✅ 串口(RS232 / USB)
  • ✅ 想做服务器还是客户端

我可以给你更精确的配置方式。

0