Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
socket
tcp
多线程
socket多线程操作转为单线程处理,断开连接检测代码展示
发布于 2021-08-10 17:33:59 浏览:1510
订阅该版
我在做一个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.5k
关于作者
大话西游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
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
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
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
ota在线升级
UART
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
at_device
ulog
C++_cpp
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
张世争
8
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
a1012112796
13
个答案
1
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
6
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
2
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部