解决TCP中Bind failed烦恼

文章目录

  • 概要
  • 样例代码

概要

当第一次运行服务端时正常,第二次运行时出现Bind failed问题。

在实际使用中,如果您尝试启动一个服务端程序并且遇到了 “Bind failed” 的错误信息,这通常意味着尝试绑定(bind)的端口已经被占用。这种情况可能有以下几个常见原因:

  • 端口占用:如果之前启动的服务端实例没有正确关闭,或者其他程序正在使用相同的端口,那么操作系统将不允许您再次绑定到该端口。

  • 未正确释放端口:在服务端程序异常退出或者没有正确关闭套接字的情况下,操作系统可能仍然认为端口正在被使用。

  • TIME_WAIT状态:即使服务端正确关闭了套接字,TCP端口可能会因为TIME_WAIT状态而暂时不可用。TIME_WAIT是TCP连接正常关闭后的一个保留状态,用于确保所有的数据包都正确地完成传输。这个状态通常会持续一段时间(通常是几分钟)。

  • 系统安全策略:某些操作系统可能有安全策略限制了对低端口号(通常是1024以下)的访问。这通常会要求服务端程序以管理员或特权用户身份运行。

为了解决 “Bind failed” 的问题,您可以采取以下几个步骤:

  • 检查端口使用情况:在Unix-like系统中,可以使用 lsof -i :端口号 或 netstat -tulnp | grep 端口号 命令来检查端口占用情况。在Windows系统中,可以使用 netstat -aon | findstr 端口号。

  • 确保正确关闭套接字:在您的代码中,确保在服务端关闭时,您调用了套接字的关闭方法。

  • 设置SO_REUSEADDR套接字选项:这个选项允许重新绑定到正在TIME_WAIT状态的端口。在C/C++中,这可以通过设置套接字选项来完成:

int yes = 1;
if (setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1) {// 错误处理
  • 更改端口号:尝试使用另一个未被占用的端口号。

  • 检查权限:确保您的程序有足够的权限来绑定所需的端口。

  • 重启系统:如果以上方法都无法解决问题,重启系统可以清除所有占用的端口,并重置网络堆栈。

样例代码

头文件

#include <ros/ros.h>
#include "std_msgs/String.h"
#include "std_msgs/Bool.h"
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include "geometry_msgs/Twist.h"
#include <thread>using namespace std;class TCPPublisher
{public:TCPPublisher();~TCPPublisher();void cmdVelCallback(const geometry_msgs::Twist::ConstPtr& msg);void acceptClients();void sendToAllClients(const std::string& message);private:ros::NodeHandle n, nPrivate;ros::Publisher tcpPub;ros::Subscriber cmdVelSub;// 创建服务器套接字int serverSocket;// 设置服务器地址结构sockaddr_in serverAddr;std::vector<int> clientSockets;std::mutex clientSocketsMutex;int clientSocket;std::string topicStatus;std::thread acceptThread;
};

main.cpp

#include "./tcp_pub/tcp_pub.h"TCPPublisher::TCPPublisher():nPrivate("~")
{nPrivate.param("topicStatus", topicStatus, std::string("/cmd_vel"));// 创建套接字serverSocket = socket(AF_INET, SOCK_STREAM, 0);// 设置套接字选项,允许重新使用本地地址和端口int yes = 1;if (setsockopt(serverSocket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1) {std::cerr << "Setsockopt failed." << std::endl;close(serverSocket);return;}/*订阅话题*/cmdVelSub = n.subscribe(topicStatus.c_str(), 10, &TCPPublisher::cmdVelCallback, this);// 设置服务器地址结构sockaddr_in serverAddr;serverAddr.sin_family = AF_INET;serverAddr.sin_addr.s_addr = INADDR_ANY;serverAddr.sin_port = htons(8080); // 服务器监听的端口号// 绑定套接字if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == -1) {std::cerr << "Bind failed." << std::endl;close(serverSocket);return;}// 监听连接if (listen(serverSocket, SOMAXCONN) == -1) {std::cerr << "Listen failed." << std::endl;close(serverSocket);return;}std::cout << "Server is listening for incoming connections..." << std::endl;// 在新线程中接受客户端连接acceptThread = std::thread(&TCPPublisher::acceptClients, this);ROS_INFO("TCPPublisher init successfully!!!");
}TCPPublisher::~TCPPublisher()
{close(serverSocket);
}void TCPPublisher::cmdVelCallback(const geometry_msgs::Twist::ConstPtr& msg)
{float velX = msg->linear.x;float angularZ = msg->angular.z;// ROS_INFO("velX : %f, angularZ : %f", velX, angularZ);// 定义字符数组,用于存储转换后的结果char buffer[50]; // 适当调整数组大小以适应你的需求snprintf(buffer, sizeof(buffer), "%f,%f", velX, angularZ);// ROS_INFO("buffer %s", buffer);std::ostringstream ss;ss << velX << "," << angularZ;sendToAllClients(ss.str());
}void TCPPublisher::acceptClients() {while (ros::ok()) {int clientSocket = accept(serverSocket, NULL, NULL);if (clientSocket == -1) {std::cerr << "Accept failed." << std::endl;continue;}std::cout << "Connection established with a client." << std::endl;// 添加到客户端列表std::lock_guard<std::mutex> guard(clientSocketsMutex);clientSockets.push_back(clientSocket);}
}void TCPPublisher::sendToAllClients(const std::string& message) {std::lock_guard<std::mutex> guard(clientSocketsMutex);for (auto it = clientSockets.begin(); it != clientSockets.end(); ) {if (send(*it, message.c_str(), message.size(), 0) == -1) {std::cerr << "Error sending message to client." << std::endl;close(*it);it = clientSockets.erase(it); // Remove from list if send fails} else {++it;}}
}int main(int argc, char **argv) {//创建节点ros::init(argc, argv, "pure_pursuit");TCPPublisher tp;  ros::spin();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/698498.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Boss直聘聊天问答

主动打招呼常用语&#xff1a; 1.您好&#xff0c;我看到贵公司的招聘需求很符合我的技术栈&#xff0c;方便约个面试聊一聊嘛&#xff1f; 2.我叫郭治江&#xff0c;2022年毕业&#xff0c;物联网工程专业&#xff0c;目前从事Java开发工作已经三年了&#xff0c;上家公司是…

推理任务稳定提点大揭秘:力大砖飞背后的科学

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

GB/T 17639-2023 长丝纺粘针刺非织造土工布检测

长丝纺粘针刺非织造土工布是指以聚酯或聚丙烯为原料&#xff0c;经纺丝、铺网、针刺加固而成的长丝纺粘针刺非织造布。 GB/T 17639-2023 长丝纺粘针刺非织造土工布测试项目&#xff1a; 测试要求 测试标准 纵横向抗拉强度 GB/T 15788 纵横向最大负荷下伸长率 GB/T 15788 …

Nginx相关命令

进入nginx程序目录&#xff0c;使用cmd在本目录下打开&#xff0c; 启动nginx&#xff1a;使用命令start nginx 本地重启nginx&#xff1a;nginx -s reload 停止&#xff1a;nginx -s stop 或者 nginx.exe -s quit 查看Nginx版本&#xff1a;nginx -v

功率MOSFET体二极管的连续载流能力

功率MOSFET体二极管的连续载流能力 1.概述2.MOSFET 漏源电压限制3.体二极管电流能力4.计算案例5.降额 tips&#xff1a;资料主要来自网络&#xff0c;仅供学习使用。 在电力电子领域或者在大功率应用场境下&#xff0c;我们经常会用到开关管功率MOSFET以及其内部的二极管。 那…

Nginx是什么?怎么用?

Nginx介绍 Nginx (读作 “engine-x”) 是一款高性能的HTTP和反向代理服务器&#xff0c;同时也可用作IMAP/POP3/SMTP代理服务器。由俄罗斯程序员Igor Sysoev开发&#xff0c;首次公开发布于2004年。Nginx以其稳定性、高性能和低内存消耗闻名&#xff0c;尤其擅长处理静态文件、…

2.23学习总结

铅球杯https://www.luogu.com.cn/problem/B3911 题目描述 蓝边铅球组织了“铅球杯”数据标注大赛。为了实现 Au 大满贯的宏大征途&#xff0c;LeAuingZ 报名参加了比赛。 蓝边铅球给出了 &#xfffd;N 个 int 类型变量的名字及其值&#xff0c;并要求 LeAuingZ 对 &#xfffd…

安全生产:AI视频智能分析网关V4如何应用在企业安全生产场景中?

随着科技的不断进步&#xff0c;视频智能分析技术在安全生产领域中的应用越来越广泛。这种技术通过计算机视觉和人工智能算法&#xff0c;可以对监控视频进行自动分析和处理&#xff0c;以实现多种功能&#xff0c;如目标检测、行为识别、异常预警等。今天我们以TSINGSEE青犀AI…

Boom 3D for Mac 破解版(3D环绕立体声音效增强软件)2.0.2中文支持M3

Mac上想要听一场极致的音乐或看一场畅快淋漓的电影&#xff1f;这些Boom 3D for Mac都可以帮您实现&#xff0c;是一款Mac音效增强工具&#xff0c;可以将二维度的音效转换成三维度&#xff0c;让您彻底的享受一下极致的听觉盛宴&#xff01; Boom 3D 2.0.2 Mac版主打音乐播放器…

【Rust】——控制流(if-else,循环)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

centos7 arm服务器编译安装onnxruntime-gpu

前言 ONNX Runtime是适用于Linux,Windows和Mac上ONNX格式的机器学习模型的高性能推理引擎,但在arm服务器上,onnxruntime只有CPU版的,GPU版的没有,因此需要自行去编译GPU版本的才可以。 环境准备 1、python3.8 2、cmake:2.26.0版本以上,可以直接下载aarch64版本的进行…

[VulnHub靶机渗透] HA: Narak

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

洛谷 P2032 扫描 (Java)

洛谷 P2032 扫描 (Java) 传送门&#xff1a;P2032 扫描 题目&#xff1a; 扫描 题目描述 有一个 1 n 1 \times n 1n 的矩阵&#xff0c;有 n n n 个整数。 现在给你一个可以盖住连续 k k k 个数的木板。 一开始木板盖住了矩阵的第 1 ∼ k 1 \sim k 1∼k 个数&#x…

JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆 反射性XSS漏洞 <% page language"java" contentType"text/html; c…

跨越千年医学对话:用AI技术解锁中医古籍知识,构建能够精准问答的智能语言模型,成就专业级古籍解读助手(LLAMA)

介绍&#xff1a;首先在 Ziya-LLaMA-13B-V1基线模型的基础上加入中医教材、中医各类网站数据等语料库&#xff0c;训练出一个具有中医知识理解力的预训练语言模型&#xff08;pre-trained model&#xff09;&#xff0c;之后在此基础上通过海量的中医古籍指令对话数据及通用指令…

Vite+Vue3+Ant Design3.2报错: Cannot read properties of null (reading ‘isCE‘)

最近的ViteVue3Ant Design Vue3.2开发的项目莫名其妙的报错&#xff1a; Uncaught (in promise) TypeError: Cannot read properties of null (reading isCE) 一直找不到原因出在哪&#xff0c;害的我费了好多时间调试 &#xff0c;百度上也找了各个解决方法&#xff0c;有说使…

React18源码: schedule任务调度messageChannel

React调度原理(scheduler) 在React运行时中&#xff0c;调度中心&#xff08;位于scheduler包&#xff09;是整个React运行时的中枢&#xff08;其实是心脏&#xff09;&#xff0c;所以理解了scheduler调度&#xff0c;就基本掌握了React的核心React两大循环&#xff1a;从宏…

uniapp实现全局悬浮框

uniapp实现全局悬浮框(按钮,页面,图片自行设置) 可拖动 话不多说直接上干货 1,在components新建组件(省去了每个页面都要引用组件的麻烦) 2,实现代码 <template><view class"call-plate" :style"top: top px;left: left px;" touchmove&quo…

Java架构师之路四、分布式系统:分布式架构、分布式数据存储、分布式事务、分布式锁、分布式缓存、分布式消息中间件、分布式存储等。

目录 分布式架构&#xff1a; 分布式数据存储&#xff1a; 分布式事务&#xff1a; 分布式锁&#xff1a; 分布式缓存&#xff1a; 分布式消息中间件&#xff1a; 分布式存储&#xff1a; Java架构师之路三、网络通信&#xff1a;TCP/IP协议、HTTP协议、RESTful API、We…

【数据分享】中国首套1公里高分辨率大气湿度指数数据集(6个指标\免费获取)

湿度数据是气象学和许多其他领域中至关重要的数据&#xff0c;可用于气象预测与气候研究。之前我们分享过Excel格式和GIS矢量格式&#xff08;均可查看之前的文章获悉详情&#xff09;的2000-2020年全国各城市逐日、逐月和逐年的湿度数据。 本次我们给大家带来的是中国首套1公…