服务器socket端口绑定失败解决方案

news/2025/2/22 19:51:08

一.服务器socket端口绑定失败

问题

学习socket的使用,服务器使用的是libevent框架,绑定和监听的是服务器的私网ip以及8000端口号。

运行程序却输出打印信息:"bind error"。

//初始化监听 socket 并开始监听客户端连接
void Server::listen(const char *ip, int port)
{
    //指定服务器的监听地址和端口。
    struct sockaddr_in server_info;
    int len = sizeof(server_info);
    //初始化结构体,确保没有不必要的垃圾数据。
    memset(&server_info, 0, len);
    server_info.sin_family = AF_INET;
    server_info.sin_port = htons(port);
    server_info.sin_addr.s_addr = inet_addr(ip);
    
    
    //evconnlistener_new_bind函数会创建一个监听TCP连接的监听器,并将其与事件基(m_base)进行绑定。
    struct evconnlistener *listener = evconnlistener_new_bind(m_base,
        listener_cb, this, LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE,
        5, (struct sockaddr *)&server_info, len);
    
   
    if (NULL == listener)
    {
        std::cout << "bind error" << std::endl;
        return;
    }
​
    //启动定时器并监听
    event_base_dispatch(m_base);
​
    //释放对象
    evconnlistener_free(listener);
    event_base_free(m_base);
}
 

解决问题:

1.是否端口号被占用:

使用sudo lsof -i :8000检测。

=》检测到端口无占用。

2.云服务器上是否在安全组上开放了这个端口

检查结果为开放了。

3.查看防火墙设置:

sudo ufw status 输出:

Status: inactive 故没有错误。

4.加上一些打印信息:

inet_addr 返回的是一个 in_addr_t 类型的值。如果无法解析传入的 IP 地址,它将返回 INADDR_NONE。 故我加上了:

server_info.sin_addr.s_addr = inet_addr(ip);
if (server_info.sin_addr.s_addr == INADDR_NONE) {
    std::cerr << "Invalid IP address: " << ip << std::endl;
    return;
}

但是我发现ip地址没有错。

故我在 evconnlistener_new_bind 函数后使用 perror 输出详细的错误信息。即:

if (NULL == listener)
    {
        std::cout << "bind error" << std::endl;
        return;
    }



却输出

bind error: Address already in use

bind error

这不是和第一点矛盾了吗?

再使用下面命令查看 当前系统中占用的端口和进程

sudo lsof -i 

输出:

main      6906            root    6u  IPv4 128322      0t0  TCP iZ7xv4i5mr54tgr8r3f9cqZ:8000 (LISTEN)
​

这里有一个名为 main 的进程,PID 为 6906,它正在监听端口 8000

而后发现原来我第一步把8000打错为8080。(手误)

从而我决定杀死这个PID。

kill -9 6906

终于问题解决了!

二.头文件被多重包含解决

#ifndef SERVER_H#define SERVER_H 是防止头文件被多重包含的常见做法。每次包含该头文件时,首先检查是否已经定义了 SERVER_H,如果没有定义则进行定义并包含文件内容。


http://www.niftyadmin.cn/n/5862704.html

相关文章

Python连接MySQL数据库完全指南

Python连接MySQL数据库完全指南 一、环境准备四部曲 1. 安装MySQL服务器&#xff08;Docker极简版&#xff09; docker run --name mysql2025 -e MYSQL_ROOT_PASSWORD123456 -p 3306:3306 -d mysql:8.4 2. 安装Python连接驱动 # 官方推荐量子加密版 pip install mysql-con…

【算法】002、编程实现社会问题

【算法】002、编程实现社会问题 文章目录 一、模拟1.1 模拟 二、多语言解法 // 一开始有100个人&#xff0c;每个人都有100元 // 在每一轮都做如下的事情 : // 每个人都必须拿出1元钱给除自己以外的其他人&#xff0c;给谁完全随机 // 如果某个人在这一轮的钱数为0&#xff0c…

【护网行动-红蓝攻防】第一章-红蓝对抗基础 认识红蓝紫

1.实战攻防演练 1.1为什么要进行实战攻防演练&#xff1f; 军事上的演练&#xff0c;是除了实战以外最能检验军队战斗力的一种考核方式&#xff0c;他可以模拟面对外部势力的攻击时候&#xff0c;如何更好的去维护国家和主权的安全。同样的&#xff0c;在网络上面&#xff0c;…

黑客疑入侵OmniGPT:3400万用户数据遭泄露

一名黑客声称已成功入侵 OmniGPT——一个由人工智能驱动的知名聊天机器人和生产力平台。此次事件导致3万名用户的电子邮件、电话号码以及超过 3400 万条&#xff08;34270455&#xff09;用户对话被泄露。这些数据由一位化名为“Gloomer”的黑客于2月9日上午在 Breach Forums 上…

Promptic:Python 中的 LLM 应用开发利器

Promptic 是一个基于 Python 的轻量级库,旨在简化与大型语言模型(LLMs)的交互。它通过提供简洁的装饰器 API 和强大的功能,帮助开发者高效地构建 LLM 应用程序。Promptic 的设计理念是提供 90% 的 LLM 应用开发所需功能,同时保持代码的简洁和易用性。 1. Promptic 的核心…

鸿蒙开发环境搭建-入门篇

本文章讲述如何搭建鸿蒙应用开发环境&#xff1a;新建工程、虚拟机运行、真机调试等。 开发工具: DevEco Studio 5.0.3.906 os系统: mac 参考文档&#xff1a;https://juejin.cn/post/7356143704699699227 官网鸿蒙应用开发学习文档&#xff1a;https://developer.huawei.com/c…

这个TensorFlow是一个开源的机器学习框架,怎么用

使用TensorFlow进行机器学习可以分为以下几个步骤&#xff1a; 安装TensorFlow&#xff1a;首先需要在你的机器上安装TensorFlow。可以通过pip命令来安装TensorFlow&#xff1a;pip install tensorflow。 准备数据&#xff1a;准备用于训练和测试的数据集。TensorFlow支持多种…

鸿蒙-状态管理V1

目录 前言状态管理V1State装饰器初始化观察能力小坑 Prop装饰器 和 Link装饰器Observed装饰器和ObjectLink装饰器使用示例小结 前言 随着鸿蒙Next的推广&#xff0c;做鸿蒙开发的人是越来越多&#xff0c;提问和寻求帮助的人也是越来越多&#xff0c;就我自己回答的问题而言&a…