0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

分享一种很简单的不阻塞TCP发送方法

冬至子 来源:BruceTan 作者:BruceTan 2023-09-20 14:23 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景介绍

最近在做一个功能的时候,要求将采集到的数据发送到TCP Server上,TCP Server有时候可能会出问题连接不上,这时候如果使用普通的TCP编程,就会造成数据采集的代码被阻塞了。

为了解决这个问题,我将TCP发送的代码使用一个单独的线程实现,数据采集的代码在另外一个线程实现,两个线程之间使用消息队列进行通信,这样既不会破坏TCP编程的基础模型,又可以实现应用代码非阻塞发送TCP数据。

代码实现

代码实现如下,当采集到数据的时候,只需要调用tcp_client_no_block_send函数发送数据即可。

#include
#include
#include
#include
#include
#include
#include
#define DBG_TAG "tcp_client"
#define DBG_LVL DBG_INFO
#include
typedef struct
{
uint8_t data[512];
uint32_t len;
}S_MSG, P_MSG;
static rt_mq_t mq = RT_NULL;
static void tcp_client_thread_entry(void
parameter)
{
int sockfd;
struct sockaddr_in server_addr;
S_MSG msg;
SOCKET_INIT:
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if( sockfd < 0 )
{
LOG_E("create socket failed.");
return;
}
rt_memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("192.168.1.100");
server_addr.sin_port = htons(10086);
if( connect(sockfd, (struct sockaddr*)(&server_addr), sizeof(server_addr)) < 0 )
{
LOG_E("connect failed");
closesocket(sockfd);
goto SOCKET_INIT;
}
while(1)
{
if( rt_mq_recv(mq, &msg, sizeof(msg), RT_WAITING_FOREVER) != RT_EOK )
{
continue;
}
if( send(sockfd, msg.data, msg.len, 0) <= 0 )
{
closesocket(sockfd);
goto SOCKET_INIT;
}
}
}
int tcp_client_no_block_send(const uint8_t *data, uint32_t len)
{
RT_ASSERT(mq!=RT_NULL);
RT_ASSERT(data!=RT_NULL);
S_MSG msg;
if( len > sizeof(msg.data) )
{
LOG_E("send len overflow");
return -1;
}
msg.len = len;
rt_memcpy(msg.data, data, len);
if( rt_mq_send(mq, &msg, sizeof(msg)) == -RT_EFULL )
{
//LOG_E("tcp client msg overflow!");
}
return 0;
}
static int tcp_client_init(void)
{
mq = rt_mq_create("tcp_mq", sizeof(S_MSG), 1, RT_IPC_FLAG_FIFO);
if (mq == RT_NULL)
{
LOG_E("create message queue failed");
return -1;
}
rt_thread_t tcp_client_thread = rt_thread_create("tcp_client", tcp_client_thread_entry, RT_NULL, 2048, 10, 10);
if (tcp_client_thread == RT_NULL)
{
LOG_E("create thread failed");
return -1;
}
rt_thread_startup(tcp_client_thread);
return 0;
}
INIT_APP_EXPORT(tcp_client_init);

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    32

    文章

    1542

    浏览量

    44294
  • TCP通信
    +关注

    关注

    0

    文章

    146

    浏览量

    4776
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    一种简单的可控硅好坏判断方法

    一种简单的可控硅好坏判断方法
    发表于 07-28 08:17 6495次阅读

    一种很简单的增量调制(DM)编码

    、CCITT μ律、GSM 6.10、PCM、ADPCM。本文将介绍一种很简单的增量调制(DM)编码方式。 DM编解码 DM(Delta Modulation)编码的原理很简单,信号处理的学习者对这个
    的头像 发表于 12-31 12:17 8799次阅读

    一种简单的OpenHarmony环境搭建方法

    本文介绍一种简单的OpenHarmony环境搭建方法
    的头像 发表于 03-14 13:58 4222次阅读
    <b class='flag-5'>一种</b><b class='flag-5'>简单</b>的OpenHarmony环境搭建<b class='flag-5'>方法</b>

    一种简单的逆变器输出直流分量消除方法

    逆变器输出直流分量会对逆变器本身和交流负载产生不利影响,必须消除直流分量来保障逆变器的可靠运行。提出了一种简单的消除输出直流分量的方法,并在理论分析的基础上,通过对1台220V、1 kW的逆变器系统
    发表于 12-27 11:20

    介绍一种快速简单创建TCP、UDP服务平台的方法

    有时候我们需要做项目的时候,需要硬件通过TCP、UDP协议和服务器交互。我介绍一种基于“nodejs”的方法,用几行代码就可以创建TCP服务和UDP服务,完成硬件客户端和服务端的交互。
    发表于 05-24 00:32

    一种节省能源的简单方法

    一种节省能源的简单方法是在晚上关闭Mac。与活动,空闲或睡眠的Mac相比,关机的Mac所消耗的能源更少。对于运行大量Mac的组织,应优先考虑整夜关机。反对在夜间关闭的个常见论点是关
    发表于 12-29 08:20

    有没有一种方法可以发送和接收不会阻塞的Http数据单片机?

    状态,是否需要重新启动,或者是否有新的固件更新,或者其他。这切都按预期工作,并按照我的期望进行操作。我遇到的问题是,每当节点需要将该 ping 发送到服务器时,LED 字符串会短暂冻结(大约秒钟)。所以我的问题是,有没有
    发表于 05-15 07:40

    是否有一种简单方法将esp连接到openhab并发送特殊命令?

    嗨, (首先抱歉我的英语不好) 个月以来我直在玩 ESP,我真的很喜欢它! 但现在我想更进步,将 ESP 连接到 Openhab 并控制灯、RGB-LED 等。 所以我的问题:是否有一种
    发表于 05-24 08:14

    如何使用中断的快速/非阻塞SPI?

    我正在寻找一种几乎连续发送 SPI 数据而阻塞 CPU 的方法。我通常使用 PlatformIO / Arduino SDK 进行开发,其
    发表于 05-29 08:01

    一种802.11DCF性能分析的简单方法

    为了简化全互连环境饱和情况下IEEE 802.11DCF的性能分析方法,采用了一种简单的盒子-球模型。研究了将活跃结点发送报文时的碰撞转换成对相同数目的球独立随机放入多个盒子问题
    发表于 05-24 11:55 12次下载

    TD-HSUPA系统的TCP优化方法

    本文提出了一种TD-HSUPA系统的TCP优化方法:利用无线网络控制器RNC(Radio Network Controller)解析TCP连接链路上服务器的反馈包信息。本
    发表于 08-03 11:30 3981次阅读
    TD-HSUPA系统的<b class='flag-5'>TCP</b>优化<b class='flag-5'>方法</b>

    一种简单背景下的快速边缘检测方法_周恩明

    一种简单背景下的快速边缘检测方法_周恩明
    发表于 03-19 11:46 0次下载

    MSP430异步通信(发送)阻塞CPU,含注释

    直接上代码/*************************发送数据帧的程序利用发送中断,发送过程阻塞CPU继续执行后续代码Author
    发表于 12-14 19:02 0次下载
    MSP430异步通信(<b class='flag-5'>发送</b>)<b class='flag-5'>不</b><b class='flag-5'>阻塞</b>CPU,含注释

    一种以硬件语言向Arduino发送消息的方法

    电子发烧友网站提供《一种以硬件语言向Arduino发送消息的方法.zip》资料免费下载
    发表于 11-02 16:14 0次下载
    <b class='flag-5'>一种</b>以硬件语言向Arduino<b class='flag-5'>发送</b>消息的<b class='flag-5'>方法</b>

    一种简单高效配置FPGA的方法

    本文描述了一种简单高效配置FPGA的方法,该方法利用微处理器从串行外围接口(SPI)闪存配置FPGA设备。这种方法减少了硬件组件、板空间和成
    的头像 发表于 10-24 14:57 2299次阅读
    <b class='flag-5'>一种</b><b class='flag-5'>简单</b>高效配置FPGA的<b class='flag-5'>方法</b>