当前位置: 首页 > news >正文

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

一.服务器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,如果没有定义则进行定义并包含文件内容。

相关文章:

  • 数学建模之数学模型-1:线性规划
  • 【天线】IFA天线知识点摘抄
  • 1.20作业
  • github 怎么创建一个私有repository 并从另外一台电脑拉取下来更新
  • cuda安装
  • poi 的导入导出 报表
  • 聊聊istio服务网格
  • leetcode_位运算 191.位1的个数
  • 网络安全知识:网络安全网格架构
  • List的基本功能(1)
  • Java List 自定义对象排序 Java 8 及以上版本使用 Stream API
  • 服务器释放screen资源(Detached状态并不会释放资源)
  • C++ 设计模式 - 策略模式
  • 【SQL实验】触发器
  • 矩阵-矩阵置零
  • 并查集算法篇上期:并查集原理及实现
  • FreeSWITCH Alpine 安装
  • 【股票数据API接口35】如何获取股票当天分价成交占比数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 亚马逊的API服务怎么使用?
  • 力扣每日一题【算法学习day.131】
  • 企业网站建设服务哪家好/seo关键词挖掘工具
  • 官网站内推广内容/seo的含义是什么意思
  • 温州做网站费用/东莞做网站优化
  • 挂马网站教程/广州seo公司
  • 工作室网站免费建设/优化公司流程制度
  • php网站开发技术训练心得/百度营销登录入口