Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
socket
tcp
多线程
socket多线程操作转为单线程处理,断开连接检测代码展示
发布于 2021-08-10 17:33:59 浏览:1118
订阅该版
我在做一个tcp客户端,既要接收数据,又要发送数据。 我的思路,很常规:搞个专门的接收线程,负责阻塞接收数据,收到数据就处理。 ![image.png](https://oss-club.rt-thread.org/uploads/20210810/3e4c860c5c14db2d1f51e3111f21277c.png) 那么我要发送数据怎么办呢? 我有个专门的发送线程,该发送线程会等待一个信号量,如果有信号量触发,则执行发送,将全局发送缓冲区内的数据发出去。 那么,请问,在一收和一发,两个线程内去操作一个socket, 安全吗?有什么注意事项吗? PS:本人以前做的都比较简单,tcp客户端收完数据就处理,然后回发处理结果的那种。
查看更多
李肯陪你玩赚嵌入式
认证专家
2021-09-15
2022年度和2023年度RT-Thread社区优秀开源布道师,COC深圳城市开发者社区主理人,专注于嵌入式物联网的架构设计
有一点需要明确的是,网络通讯是全双工的,也就是说收和发是互不影响的; 所以如果你把收发放在同一个线程来做,除非客户端和服务端的交互就是一来一回的; 这样没有问题,假如有服务端是不是主动下发一个消息给你,或者客户端需要是不是上报一个类似心跳的数据包给服务器的话; 那么将收发放在一个线程的最大弊端就是响应的实时性问题,这是不得不考虑的问题。 我个人在项目中,是使用收发线程分离的,即一个专门的收线程,这个线程不干别的,就仅负责接收服务器的消息,并做应用协议层的基本解析,比如去掉包头、包尾,校验这些,之后把校验ok的数据包写到一个消息队列(接收消息队列),通过消息队列传递到你真正需要使用这段应用数据的线程,这个线程就只从消息队列取数据; 网络发送线程也类似的思路,它只负责从消息队列(发送消息队列)中取数据包,然后组包加校验,发送到服务器; 而真正需要发送应用数据的线程,只需要把自己的数据包发动到消息队列(发送消息队列)就行,其他事它不关心。 整个模型图类似如下所示: ![image.png](https://oss-club.rt-thread.org/uploads/20210915/d882983ab3bccf981f89c626977ede5b.png.webp) 这个模式,最大的好处就是解耦,各司其职,互不干扰,易于扩展。 以上答案提供点思路,仅供参考。
5
个回答
默认排序
按发布时间排序
小小李sunny
2021-08-10
这家伙很懒,什么也没写!
正常来说,这样操作应该是没啥问题的。我这边有过类似的应用场景,创建socket后,启动接收和发送线程。有一个专门的接收线程用于接收服务器的数据;另外会有一个线程周期性的向服务器发送数据。制定的通信协议方式为:客户端发送数据后接收服务器应答,客户端接收服务器数据后发送应答。
出出啊
2021-08-10
恃人不如自恃,人之为己者不如己之自为也
严格讲,一个socket 不允许多线程操作。 作为一个客户端,一个 socket 玩儿这种异步通信,客户端和服务端处理都很复杂。 你最后说的其实用一个线程就能完成,接收读,处理,回传写。这样不影响你下一次数据接收的。
大话西游2018
2021-08-10
这家伙很懒,什么也没写!
解决方案: 把数据的收发都做到一个线程内, ![image.png](https://oss-club.rt-thread.org/uploads/20210810/7dc282e7b32dcd8b9f4672fdbaed4dc3.png.webp) 参考资料: socket为send和recv设置超时时间 https://www.cnblogs.com/lidabo/p/3804245.html .
CrazyH
2023-12-25
这家伙很懒,什么也没写!
如果是lwip。最好不要在多线程操作socket。
撰写答案
登录
注册新账号
关注者
0
被浏览
1.1k
关于作者
大话西游2018
这家伙很懒,什么也没写!
提问
36
回答
40
被采纳
1
关注TA
发私信
相关问题
1
freemodbus tcp
2
stm32f103 LWIP 2.0.2 TCP收发问题
3
AT_DEVICE TCP 接收大文件失败!
4
RT thread freemobus tcp通讯问题
5
hard fault on thread: tcpip
6
RT系统TCP收数据速度慢
7
TCP Client 断线重连
8
TCP数据包多包重合的问题
9
rtthread simulator中能够使用WIN10中得TCP/IP服务吗
10
lwip 跨网段ping不通的问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
国产MCU移植系列教程汇总,欢迎查看!
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
[RA8D1-Vision Board] sd卡实践
2
FRDM-MCXN947开发板之RGB LED驱动
3
NXP MCXN947 测评(2)基于GPIO 控制实现DHT11 温湿度采集
4
RT-Thread Vision Board - Bare Metal Project with VSCode/PyOCD/Cortex-Debug
5
【学习分享】libc切换 -- 从newlib切换到mlibc
热门标签
RT-Thread Studio
串口
LWIP
Env
SPI
Bootloader
AT
ART-Pi
Hardfault
CAN总线
FinSH
USB
文件系统
DMA
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
ota在线升级
WIZnet_W5500
I2C_IIC
UART
flash
cubemx
packages_软件包
freemodbus
潘多拉开发板_Pandora
PWM
定时器
ADC
BSP
中断
编译报错
socket
keil_MDK
GD32
MicroPython
msh
Debug
ulog
SFUD
flashDB
SDIO总线
rt_mq_消息队列_msg_queue
本月问答贡献
用户名由3_15位
19
个答案
3
次被采纳
踩姑娘的小蘑菇
16
个答案
3
次被采纳
xiaorui
7
个答案
3
次被采纳
sakumisu
5
个答案
3
次被采纳
三世执戟
32
个答案
1
次被采纳
本月文章贡献
比特饼干
3
篇文章
10
次点赞
Z_Y
2
篇文章
5
次点赞
xusiwei1236
2
篇文章
3
次点赞
yinxiangxv
2
篇文章
3
次点赞
Alipay
2
篇文章
3
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部