📌  相关文章
📜  代码:'EADDRINUSE',[0] errno:'EADDRINUSE',[0] 系统调用:'listen',[0] 地址:'::',[0] 端口:5000 - C 编程语言(1)

📅  最后修改于: 2023-12-03 15:22:03.463000             🧑  作者: Mango

代码:'EADDRINUSE',[0] errno:'EADDRINUSE',[0] 系统调用:'listen',[0] 地址:'::',[0] 端口:5000 - C 编程语言

这个错误信息通常表示在执行 listen() 系统调用时,端口已经被占用。这可能是因为:

  • 该端口已经被另一个程序占用;
  • 该程序之前已经运行,在运行结束后并没有及时释放端口。

要解决这个错误,可以采取以下措施:

  • 修改代码,将监听的端口改为其他未被占用的端口;
  • 终止占用该端口的程序,或者等待该程序退出以释放端口;
  • 使用 setsockopt() 系统调用设置 SO_REUSEADDR 选项,让该端口在程序退出后立即释放,供后续程序使用。

以下是一个示例代码片段,展示了如何使用 setsockopt() 设置 SO_REUSEADDR 选项:

int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
    perror("socket failed");
    return -1;
}

int reuse = 1;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) == -1) {
    perror("setsockopt failed");
    return -1;
}

struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(5000);
addr.sin_addr.s_addr = INADDR_ANY;

if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
    perror("bind failed");
    return -1;
}

if (listen(sock, SOMAXCONN) == -1) {
    perror("listen failed");
    return -1;
}

// accept and handle connections...

注意,使用 SO_REUSEADDR 选项可能会存在一些安全风险,应该仅在必要时才使用。