广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么使用C++ Thread实现简单的socket多线程通信
  • 167
分享到

怎么使用C++ Thread实现简单的socket多线程通信

2023-07-02 15:07:36 167人浏览 泡泡鱼
摘要

本篇内容介绍了“怎么使用c++ Thread实现简单的Socket多线程通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端多

本篇内容介绍了“怎么使用c++ Thread实现简单的Socket多线程通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

服务端

线程功能放在腾讯云服务器上,代码如下:

#include "tcpserver.h"#include <thread>#include <mutex>TcpServer server;mutex tcp_mutex;void tcpFunc(int clientfd);int main(int arGC, char *argv[]){    if (server.initServer(6666) == false)    {        cout << "服务端初始化失败!!!" << endl;        return -1;    }    vector<thread> tcp_vec;    while (true)    {        if (!server.tcpAccept())        {            continue;        }        tcp_vec.emplace_back(tcpFunc, server.m_connectfd);        // thread tcpThread(tcpFunc, server.m_connectfd);        // if (tcpThread.joinable())        if(tcp_vec.back().joinable())        {            // cout << "Tcp thread " << tcpThread.get_id() << "is joinable!" << endl;            cout << "Tcp thread " << tcp_vec.back().get_id() << " is joinable!" << endl;            tcp_vec.back().detach();        }    }    return 0;}void tcpFunc(int clientfd){    int buf_len = 0;    char buffer[1024];    while (true)    {        unique_lock<mutex> tcplck(tcp_mutex);        memset(buffer, 0, sizeof(buffer));        if (!server.tcpRecv(clientfd, buffer, &buf_len, 5))        {            cout << "接收客户端数据失败!" << endl;            tcplck.unlock();            break;        }        cout << "服务端接收数据:" << buffer << endl;        strcpy(buffer, "I am your father!");        if (!server.tcpSend(clientfd, buffer, sizeof(buffer)))        {            cout << "向客户端发送数据失败!" << endl;            tcplck.unlock();            break;        }        tcplck.unlock();                usleep(100);    }    cout << "通信异常!" << endl;    return;}

实在是很简单,贻笑大方了

有几个注意点:

  • 全局变量在main函数执行完后会销毁,线程中用到了全局变量server,线程detach后要保证数据的收发,就要保持server的生存期,这里体现为在main中循环等待客户端的连接

  • 要用锁住线程中server的操作,避免不同线程同时操作server造成混乱

  • usleep(100);是为了避免不同线程争抢同一把锁而造成死锁的发生

ROS客户端

#include "tcpclient.h"#include <ros/ros.h>#include <geometry_msgs/Twist.h>TcpClient client;string send_str = "I am king of the world!";char recv_buff[1024];void client_callback(const geometry_msgs::Twist::ConstPtr &msg){    cout << "vel X:" << msg->linear.x << ";vel Y:" << msg->linear.y << ";angular Z:" << msg->angular.z << endl;    if (!client.tcpSend(client.m_sockfd, send_str.data(), send_str.size()))    {        cout << "向服务端发送报文失败!" << endl;    }    if (!client.tcpRecv(client.m_sockfd, recv_buff, NULL, 10))    {        cout << "从服务端接收报文失败!" << endl;    }    cout << "接收服务端报文:" << recv_buff << endl << endl;}int main(int argc, char **argv){    ros::init(argc, argv, "joystick_client");    ros::nodeHandle nh;    string server_ip = "1.116.137.21";    string loop_ip = "127.0.0.1";    if (client.connectToServer(server_ip.data(), 6666) == false)    {        cout << "连接失败!!!" << endl;        return -1;    }    ros::Subscriber sub = nh.subscribe("/cmd_vel", 1, client_callback);    ros::spin();}

很简单,订阅了手柄发布的话题/cmd_vel,在回调函数中和服务端通讯

话题的发布频率是10Hz,意味着和服务端通讯的频率也是10Hz

普通客户端

#include "tcp/tcpclient.h"int main(int argc, char **argv){    TcpClient client;    string server_ip = "1.116.137.21";    string loop_ip = "127.0.0.1";    if (client.connectToServer(server_ip.data(), 6666) == false)    {        cout << "连接失败!!!" << endl;        return -1;    }    cout << "成功连接服务器!" << endl;    char buff[1024];    while (true)    {        memset(buff, 0, sizeof(buff));        sprintf(buff, "Ouch!");        if (!client.tcpSend(client.m_sockfd, buff, sizeof(buff)))        {            cout << "向服务端发送报文失败!" << endl;            return -1;        }        memset(buff, 0, sizeof(buff));        if (!client.tcpRecv(client.m_sockfd, buff, NULL, 5))        {            cout << "从服务端接收报文失败!" << endl;            return -1;        }        cout << "接收服务端报文:" << buff << endl << endl;        sleep(0.1);    }    return 0;}

这里sleep(0.1);是为了模拟ROS中话题的频率

sleep过长会导致服务端阻塞等待该客户端的消息,从而导致其余客户端与服务端的通信失败(如果客户端中允许的通信延时很短的话)

运行效果

服务器上的服务端

[root@VM-4-11-Centos bin]# ./server_thread 
Tcp thread 140662362572544 is joinable!
服务端接收数据:I am king of the world!
服务端接收数据:I am king of the world!
服务端接收数据:I am king of the world!
服务端接收数据:I am king of the world!
Tcp thread 140662354179840 is joinable!
服务端接收数据:I am king of the world!
服务端接收数据:Ouch!
服务端接收数据:I am king of the world!
服务端接收数据:Ouch!
服务端接收数据:I am king of the world!
服务端接收数据:Ouch!
服务端接收数据:I am king of the world!
服务端接收数据:Ouch!

笔记本上的ROS客户端

redwall@redwall-G3-3500:~$ rosrun joystick_client joystick_client 
[ERROR] [1656939307.244367879]: [reGISterPublisher] Failed to contact master at [localhost:11311].  Retrying...
[ INFO] [1656939314.923909682]: Connected to master at [localhost:11311]
vel X:0;vel Y:0;angular Z:0
接收服务端报文:I am your father!

vel X:0;vel Y:0;angular Z:0
接收服务端报文:I am your father!

vel X:0;vel Y:0;angular Z:0
接收服务端报文:I am your father!

虚拟机的普通客户端

  • prejudice@prejudice-VirtualBox:~/socket_test/socket_for_linux/bin$ ./tcp_client 成功连接服务器!

  • 接收服务端报文:I am your father!

  • 接收服务端报文:I am your father!

  • 接收服务端报文:I am your father!

“怎么使用C++ Thread实现简单的socket多线程通信”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: 怎么使用C++ Thread实现简单的socket多线程通信

本文链接: https://www.lsjlt.com/news/342756.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++Thread实现简单的socket多线程通信
    目录起因服务端ROS客户端普通客户端运行效果不足起因 为什么要用C++的Thread,很简单,因为我菜 一打五用pthread实现了socket多线程通信,我之前学并发的时候没看pt...
    99+
    2022-11-13
  • 怎么使用C++ Thread实现简单的socket多线程通信
    本篇内容介绍了“怎么使用C++ Thread实现简单的socket多线程通信”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务端多...
    99+
    2023-07-02
  • php怎么使用socket简单实现通信功能
    这篇文章主要讲解了“php怎么使用socket简单实现通信功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php怎么使用socket简单实现通信功能”吧!WebSocket的作用WebSo...
    99+
    2023-07-05
  • Java中的单线程通信如何利用 Socket实现
    这期内容当中小编将会给大家带来有关Java中的单线程通信如何利用 Socket实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java Socket实现单线程通信的方法,具体如下:现在做Java直接使用...
    99+
    2023-05-31
    java socket 单线程通信
  • Java项目中的多线程通信如何利用Socket实现
    这期内容当中小编将会给大家带来有关Java项目中的多线程通信如何利用Socket实现,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Java Socket实现多线程通信的方法,代码如下:package co...
    99+
    2023-05-31
    java socket 多线程通信
  • C++怎么实现一个简单的线程池
    本文小编为大家详细介绍“C++怎么实现一个简单的线程池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现一个简单的线程池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、设计线程池应该包括保存线程的容...
    99+
    2023-06-30
  • 怎么在c#中利用委托事件实现多线程通信
    本篇文章为大家展示了怎么在c#中利用委托事件实现多线程通信,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在研究c# 线程之间通信时,发现传统的方法大概有三种:全局变量,由于同一进程下的多个进程之间共...
    99+
    2023-06-14
  • 怎么使用Java socket通信模拟QQ实现多人聊天室
    这篇文章主要介绍“怎么使用Java socket通信模拟QQ实现多人聊天室”,在日常操作中,相信很多人在怎么使用Java socket通信模拟QQ实现多人聊天室问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-07-02
  • 怎么用Python实现简单的C++程序范围
    本篇内容主要讲解“怎么用Python实现简单的C++程序范围”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用Python实现简单的C++程序范围”吧!1. 实验说明问题要求:针对静态单赋值(...
    99+
    2023-06-29
  • Java怎么使用wait或notify实现线程间通信
    这篇文章主要介绍“Java怎么使用wait或notify实现线程间通信”,在日常操作中,相信很多人在Java怎么使用wait或notify实现线程间通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java怎...
    99+
    2023-07-04
  • 怎么用C#实现简单的计算器小程序
    这篇文章主要介绍“怎么用C#实现简单的计算器小程序”,在日常操作中,相信很多人在怎么用C#实现简单的计算器小程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C#实现简单的计算器小程序”的疑惑有所帮助!...
    99+
    2023-06-29
  • Java中怎么使用wait和notify实现线程间的通信
    这篇“Java中怎么使用wait和notify实现线程间的通信”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中怎么使...
    99+
    2023-06-30
  • Java中的多线程回显服务器怎么利用Socket实现
    Java中的多线程回显服务器怎么利用Socket实现?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体如下:需要两个类,一个是EchoServer,代表服务器。另外一个是Ech...
    99+
    2023-05-31
    java socket 多线程
  • 怎么使用JavaScript实现一个简单的通讯录
    这篇文章主要介绍“怎么使用JavaScript实现一个简单的通讯录”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用JavaScript实现一个简单的通讯录”文章能帮助大家解决问题。创建通讯录对...
    99+
    2023-07-06
  • 怎么使用C#实现简单的计算器功能
    这篇文章主要介绍怎么使用C#实现简单的计算器功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!环境:VS2010及以上版本建立个Window窗体应用在工具箱里拖出两个TextBox,第一个放上面,第二个放下面 。主要...
    99+
    2023-06-29
  • Java中使用Thread类和Runnable接口实现多线程的区别是什么
    这篇“Java中使用Thread类和Runnable接口实现多线程的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“...
    99+
    2023-07-02
  • 怎么在c#中使用Parallelx实现并行和多线程编程
    本篇文章给大家分享的是有关怎么在c#中使用Parallelx实现并行和多线程编程,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。一、 Parallel的使用Parallel.In...
    99+
    2023-06-06
  • 怎么使用jQuery实现简单的流程显示
    这篇文章主要介绍了怎么使用jQuery实现简单的流程显示的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用jQuery实现简单的流程显示文章都会有所收获,下面我们一起来看看吧。jQuery是一个非常流行的J...
    99+
    2023-07-05
  • python怎么使用SimpleXMLRPCServer实现简单的rpc过程
    这篇文章主要介绍了python怎么使用SimpleXMLRPCServer实现简单的rpc过程的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇python怎么使用SimpleXMLRPCServer实现简单的rp...
    99+
    2023-07-02
  • C#多线程控制进度条的异步调用怎么实现
    这篇文章主要讲解了“C#多线程控制进度条的异步调用怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#多线程控制进度条的异步调用怎么实现”吧!看看具体的步骤和实现:在上面的代码中,我们...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作