ROS系统下完成TCP通信 C语言编程

2023-05-16

ROS系统下完成TCP通信,服务端和客户端C语言编程
服务端(Server):

#include <std_msgs/Bool.h>
#include "ros/ros.h"
#include<stdio.h>
#include<thread>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <unistd.h>

#define MAXLINE 4096
int    listenfd, connfd;
struct sockaddr_in     servaddr;
ros::Publisher robot_flag_publish ;

void init()
{
    if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 )
    {
		printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
		exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(8989);

    if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
	{
		printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
		exit(0);
    }

    if( listen(listenfd, 10) == -1)
	{
		printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
		exit(0);
    }

    printf("======waiting for client's request======\n");
    while(1)
    {
		if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1)
		{
			printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
			continue;
		}
		else
		{
			break;
		}
   }
}

void receive()
{
        while(1)
        {
                char    buff[4096];
		int n = recv(connfd, buff, MAXLINE, 0);
		if(n > 0)
		{
			printf("recv msg from client: %s\n", buff);
                        std_msgs::Bool data;
                        data.data = true;
                        robot_flag_publish.publish(data);
		}
	}
}

void flag_message(const std_msgs::Bool &flag_data)
{
    if(flag_data.data==true)
    {
        char buff_send[] = "success";
        send(connfd, buff_send, strlen(buff_send),0);
        printf("send msg\n");
    }
}

int main(int argc, char** argv)
{
    ros::init(argc,argv,"server");
    ros::NodeHandle nh;
    ros::NodeHandle n("~");
    ros::Subscriber robot_flag_subScribe = n.subscribe("/robot1_flag",1,&flag_message);
    robot_flag_publish   = nh.advertise<std_msgs::Bool>("robot2_flag", 1);

    init();
    //std::thread recv_thread(receive);
    while(ros::ok)
    {
        char    buff[4096];
        int n = recv(connfd, buff, MAXLINE, 0);
        if(n > 0)
        {
                printf("recv msg from client: %s\n", buff);
                std_msgs::Bool data;
                data.data = true;
                robot_flag_publish.publish(data);
        }
        ros::spinOnce();
    }
    close(connfd);
    close(listenfd);
    //recv_thread.join();
    return 0;
}

客户端(Client):

#include <std_msgs/Bool.h>
#include "ros/ros.h"
#include<stdio.h>
#include<thread>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

#define MAXLINE 4096
int    sockfd;
struct sockaddr_in     servaddr;
ros::Publisher robot_flag_publish ;

void init()
{
    if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
            printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
            exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    servaddr.sin_port = htons(8989);


    if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0)
    {
        printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
        exit(0);
    }
}

void receive()
{
        while(1)
        {
                char    buff[4096];
                int n = recv(sockfd, buff, MAXLINE, 0);
		if(n > 0)
		{
			printf("recv msg from client: %s\n", buff);
                        std_msgs::Bool data;
                        data.data = true;
                        robot_flag_publish.publish(data);
		}
	}
}

void flag_message(const std_msgs::Bool &flag_data)
{
    if(flag_data.data==true)
    {
        char buff_send[] = "success";
        send(sockfd, buff_send, strlen(buff_send),0);
        printf("send msg\n");
    }
}

int main(int argc, char** argv)
{
    ros::init(argc,argv,"client");
    ros::NodeHandle nh;
    ros::NodeHandle n("~");
    ros::Subscriber robot_flag_subScribe = n.subscribe("/robot2_flag",1,&flag_message);
    robot_flag_publish   = nh.advertise<std_msgs::Bool>("robot1_flag", 1);

    init();
    //std::thread recv_thread(receive);
    while(ros::ok())
    {
        char    buff[4096];
        int n = recv(sockfd, buff, MAXLINE, 0);
        if(n > 0)
        {
                printf("recv msg from client: %s\n", buff);
                std_msgs::Bool data;
                data.data = true;
                robot_flag_publish.publish(data);
        }
        ros::spinOnce();
    }
    printf("end\n");
    close(sockfd);
    //recv_thread.join();
    return 0;
}

关于CMakeLista.txt与package.xml的设置
在这里插入图片描述

关于CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(my_socket)

set(CMAKE_CXX_FLAGS "-std=c++11 -Wall ${CMAKE_CXX_FLAGS}")

find_package(catkin REQUIRED COMPONENTS
  std_msgs
  roscpp
)

catkin_package(

)


include_directories(
  ${catkin_INCLUDE_DIRS}
)

add_executable(server 
  src/server.cpp
)
target_link_libraries(server
  ${catkin_LIBRARIES}
)

add_executable(client
  src/client.cpp
)
target_link_libraries(client
  ${catkin_LIBRARIES}
)


关于package.xml

<package>
<name>my_socket</name>
<version>0.0.0</version>
<description>The socket package</description>
<maintainer email="flight1506263@126.com">flight</maintainer>
<license>TODO</license>
<author email="flight1506263@126.com">flight</author>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>std_msgs</build_depend>
<build_depend>roscpp</build_depend>
<run_depend>std_msgs</run_depend>
<run_depend>roscpp</run_depend>
<!--  The export tag contains other, unspecified, tags  -->
<export>
<!--  Other tools can request additional information be placed here  -->
</export>
</package>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS系统下完成TCP通信 C语言编程 的相关文章

  • C++书籍推荐(小白变大牛最全书单)

    一 C 43 43 书籍推荐之手册类 xff08 适用所有级别 xff09 可以关注博主的微 信 公 众 号 xff1a C和C加加 回复 88 即可领取相关电子书和C 43 43 教程大全 1 C 43 43 程序设计语言 The C 4
  • 最新C语言编程软件推荐(2021整理)

    一 C语言编程软件推荐 C语言编程软件适于编写系统软件 xff0c 是学习编程的同学们的必备软件 c语言一种应用非常广泛的编程语言 xff0c 不仅仅是在软件开发上 xff0c 而且各类科研都会用到c语言 今天小编给大家汇总下C语言的编程软
  • Jmeter性能测试(4)---HTTP请求详解

    jmeter xff08 四 xff09 HTTP请求 启动jmeter xff0c 建立一个测试计划 启动 xff1a 打开jmeter文件夹 xff0c bin文件 jmeter bat xff08 Windows执行文件 xff09
  • C语言和C++的区别和联系

    C语言虽说经常和C 43 43 在一起被大家提起 xff0c 但可千万不要以为它们是一种编程语言 我们来介绍C语言和C 43 43 中的区别和联系 首先C 43 43 和C语言本来就是两种不同的编程语言 xff0c 但C 43 43 确实是
  • 字符串的定义及何时添加‘\0‘问题

    定义字符串的六种形式 xff1a char arr 61 34 hello world 34 原理 xff1a 字符串常量的值本质上是第一个字符的地址 char arr arr 61 34 hello world 34 的改写 char a
  • 什么是云技术?

    云技术是指在广域网或局域网内将硬件 软件 网络等系列资源统一起来 xff0c 实现数据的计算 储存 处理和共享的一种托管技术
  • 深度学习神经网络归一化方法及MATLAB函数

    归一化方法及 MATLAB函数 数据归一化方法是神经网络预测前对数据常做的一种处理方法 数据归一化处理把所有数据都转化为 xff3b 0 xff0c 1 xff3d 之间的数 xff0c 其目的是取消各维数据间数量级差别 xff0c 避免因
  • 2022数模国赛B题无人机第一题第一小问的简单编程

    前言 2022年国赛B题是关于无人机定位的抽象模型 xff0c 总体难度不大 接下来简单介绍一下第一题第一小问的程序实现 xff0c 当时国赛仓促 xff0c 写的比较简略 xff0c 仅供参考 背景介绍 无源定位 第一个关键词是无源定位
  • Linux基础之网络编程

    网络编程篇 一 网络编程概述二 字节序三 socket编程步骤四 socket服务端和客户端代码的初步实现五 简单的ftp项目实现的功能有哪些 xff1f 六 ftp项目服务器和客户端代码实现 一 网络编程概述 1 进程间通信 xff1a
  • F450无人机组装与调试

    文章目录 认识无人机零部件机架图片 电机电调螺旋桨飞控套件 包括飞控 LED信号灯 xff0c GPS模块 xff0c 电源管理模块 遥控器及遥控器接收机电池护桨 确认工具清单组装过程1 组装机架2 组装电机判断电机正反选择螺丝组装电机连接
  • Openstack-mitaka安装部署

    openstack 一台controller xff0c 一台compute 且两台均为双网卡 xff0c ens33为主网卡 xff0c ens36不需要配置IP 主机名称 网卡名称 网卡类型 网卡IP ens33 controllere
  • Vue history模式路由 部署到二级目录 配置

    1 nginx配置 https xxxx com cms gt C static server cms location cms root C static server 项目部署资源所在磁盘目录 index index html try
  • 【Docker】将本地镜像推送到远程库/私有库

    前言 这里记录如何将本地镜像推送到远程库和私有库 区别 xff0c 一个是存放到阿里云 xff0c 同一个团队可以登录到同一个阿里云仓库 xff0c 去拉取镜像 一个是存放到本地私有库 xff0c 同一个团队可以连接同一个私有库 xff0c
  • HTTP协议--几种数据传输方式

    1 xff09 无状态 http协议是一种自身不对请求和响应之间的通信状态进行保存的协议 xff0c 即无状态协议 这种设置的好处是 xff1a 更快的处理更多的请求事务 xff0c 确保协议的可伸缩性 不过随着web的不断发展 xff0c
  • PDU 超链接

    http blog sina com cn s blog 453226290102wvnu html http blog sina com cn s blog 453226290102wvnv html http blog sina com
  • Canal监控MySQL数据到Kafka详细步骤(jdk+zookeeper+kafka+canal+mysql)

    目录 一 前言二 环境准备三 安装JDK四 安装zookeeper五 安装Kafka六 安装MySQL七 安装canal服务端 xff08 canal监控mysql数据发送到kafka xff09 八 测试是否可以监控到数据九 结语 一 前
  • 流媒体服务器搭建

    本文介绍如何在阿里云 腾讯云等云主机上搭建流媒体服务器 xff0c 包括如何选择云主机配置 如何选择带宽和流媒体服务器软件选择等 流媒体服务器是支撑视频播出的基础系统 xff0c 具有视频直播 视频点播的播出能力 xff0c 有些使用场景下
  • 什么是BGP

    文章目录 1 基本概念什么是BGPBGP路由协议的特点IBGP水平分割规则BGP的路由器号 Router ID BGP工作原理BGP分类 1 基本概念 自治系统 xff0c 指的是在同一个组织管理下 使用相同策略的设备的集合 xff1b 不
  • Web服务------Nginx域名重定向(Location匹配与Rewrite重写)

    目录 一 常用的Nginx正则表达式二 location1 location 的分类2 location 常用的匹配规则3 location 优先级4 location 示例说明5 优先级总结6 匹配规则 二 rewrite1 rewrit
  • 华为云-计算云服务介绍

    前言 相信很多小伙伴在刚开始接触各类云产品的时候 xff0c 被各种各样的云产品类如规格 型号 价格 适用场景等问题所困扰 本文就给大家介绍一下华为云常见云产品的规格区别和适用场景 帮助大家选择合适的云产品 文章目录 前言一 计算云服务1

随机推荐

  • 数据资源 | 八大板块!数据公开下载渠道

    本文综合整理自网站企研 中国学术大数据平台 xff08 https r qiyandata com xff09 来源 xff1a 企研 中国学术大数据平台 公共数据资源 目录 三农 地理信息 生态环境 碳中和 调查数据 省级统计局 省级政府
  • [C++] std::vector

    std vector template lt class T class Alloc 61 allocator lt T gt gt class vector generic template vector是表示可以改变大小的数组的序列容器
  • centos克隆

    下一步 下一步 选中创建完整克隆 启动克隆的系统 编辑 xff1a vi etc udev rules d 70 persistent net rules 修改之后 修改端口号和attr 修改完 执行 重启 xff1a reboot pin
  • 用pyhon下载jupyter遇到的问题(pip版本过低)

    首先安装jupyter 的前提是需要提前安装python 3 3版本及以上 然后输入 pip install jupyter 出现下面问题 python V 在命令行窗口输入 xff0c 验证python的版本 pip install ju
  • ubuntu利用usb_cam打开摄像头

    一 安装摄像头驱动usb cam 想要标定多个相机 xff0c 首先得把相机打开吧 xff0c usb cam是针对usb摄像头的ros驱动包 xff0c 简单来说就是得有这个功能包 xff0c 才能在ros中把摄像头打开 首先打开终端 x
  • Jmeter性能测试(1)---基础介绍

    jmeter xff08 一 xff09 基础介绍 参考书籍 xff1a 段念 软件性能测试与案例剖析 第二版 推荐一本书 零成本实现web性能测试 基于Apache jmeter xff0c 主要内容是一些关于jmeter的实战使用 xf
  • 利用Opencv实现物体的跟踪(1)

    目前感觉 xff0c 利用opencv实现的物体追踪 xff0c 关键要设置好你所检测对象的area xff0c 不然很容易出现混乱 本人也是自学 xff0c 敬请批评指正 import cv2 定义运算的核算子 BLUR RADIUS 6
  • C语言连连看秒杀辅助

    图像处理第一课 连连看秒杀辅助 项目效果 直接使用C语言 xff0c 实现 连连看 最强辅助 项目分析 项目的技术核心 不是逆向 xff0c 而是图像处理 图像处理 xff0c 更高维度的技术手段 电影中的图像处理应用 无人机战争 电影 完
  • 推荐10款适合C/C++开发人员的IDE

    IDE是程序员用于编程的应用程序或软件 IDE主要包括三部分 xff0c 即源代码编辑器 xff0c 构建自动化工具 xff08 编译器 xff09 和调试器 源代码编辑器是程序员可以编写代码的地方 xff0c 而程序员使用构建自动化工具来
  • C++五子棋人机对战

    目录 本教程配套视频 1 项目目标 2 效果演示 3 创建项目 4 项目框架设计 4 1 设计项目框架 4 2 根据设计框架创建类 5 给类添加主要接口 5 1 设计棋盘类Chess的主要接口 5 2 设计AI类的主要接口 5 3 设计Ma
  • VSCode这13款插件也太好用了

    又见VsCode Visual Studio Code xff08 简称VS Code xff09 是一个由微软开发 xff0c 同时支持Windows Linux 和 macOS 等操作系统的免费代码编辑器 xff0c 在2019年的St
  • C语言和C++的区别和联系,大多数人都说错了

    前言 C语言和C 43 43 到底是什么关系 xff1f 首先C 43 43 和C语言本来就是两种不同的编程语言 xff0c 但C 43 43 确实是对C语言的扩充和延伸 xff0c 并且对C语言提供后向兼容的能力 对于有些人说的C 43
  • C++之父做决定了:内部自救!

    进入2023年 xff0c 技术圈都在围观大洋彼岸的聊天机器ChatGPT xff0c 但对于编程圈而言 xff0c 没有什么比内存安全更能引起热议 近期美国国家安全局 xff08 NSA xff09 点名批评C 43 43 xff0c 建
  • 使用数组实现:约瑟夫环问题

    使用数组实现约瑟夫环问题的写法 xff1a include lt iostream gt include lt vector gt using namespace std vector lt int gt josephus int n in
  • 何谓春招?

    一 什么是春招 xff1a 春招是指一年中在春季进行的毕业生招聘活动 xff0c 很多公司在这个时间开始准备新一年的业务计划和预算 春招可以理解为是秋招的大型补招 xff0c 规模是秋招的60 左右 xff0c 抓住校园招聘的最后机会上岸心
  • Jmeter性能测试(2)---脚本录制

    jmeter xff08 二 xff09 录制脚本 对大多数刚开始接触性能测试的人来说 xff0c 代码功力可能不是太好 xff0c 我们可以通过工具 xff0c 录制脚本来进行测试 xff0c 以达到我们的目的 一般来讲 xff0c 录制
  • 为什么越来越多的IT人考软考?

    近几年随着国家计算机与软件技术的发展 xff0c 每年报名参加软考考试的人也越来越多 据工信部新闻发布会消息 xff0c 计算机软件与通信专业技术人员职业资格考试累计报考人数超过485万 xff0c 2022年报考人数129万人 01 为什
  • javascript里裁切图片插件库

    第三方库 cropperjs 适用于JS Vue Jquery 安装 npm install cropperjs 按照格式要求配置如下 lt Wrap the image or canvas element with a block ele
  • Ubuntu安装ROS系统

    昨天安装ros系统用了一天时间 xff0c 所以安装ros前一定要做好心理准备 希望我的经验能够有所帮助 以下方式是安装ros系统的一种方法 xff0c 不是具体的安装步骤 Ubuntu安装ROS系统方法 xff1a 一 Bilibili观
  • ROS系统下完成TCP通信 C语言编程

    ROS系统下完成TCP通信 xff0c 服务端和客户端C语言编程 服务端 xff08 Server xff09 xff1a span class token macro property span class token directive