精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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
    +關注

    關注

    31

    文章

    1273

    瀏覽量

    39926
  • TCP通信
    +關注

    關注

    0

    文章

    146

    瀏覽量

    4217
收藏 人收藏

    評論

    相關推薦

    一種簡單的可控硅好壞判斷方法

    一種簡單的可控硅好壞判斷方法
    發表于 07-28 08:17 ?6279次閱讀

    一種很簡單的增量調制(DM)編碼

    、CCITT μ律、GSM 6.10、PCM、ADPCM。本文將介紹一種很簡單的增量調制(DM)編碼方式。 DM編解碼 DM(Delta Modulation)編碼的原理很簡單,信號處理的學習者對這個
    的頭像 發表于 12-31 12:17 ?7760次閱讀

    一種簡單的OpenHarmony環境搭建方法

    本文介紹一種簡單的OpenHarmony環境搭建方法
    的頭像 發表于 03-14 13:58 ?3389次閱讀
    <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

    介紹一種簡單的數據解析方法

    JSON。? 下面我將介紹一種簡單的數據解析方法,通過編寫函數,將字符串解析取得目標數據。解析字符型數據函數原型/*** @brief從段字符串中解析期望的字符串* @parampB
    發表于 02-28 06:15

    有沒有一種方法可以發送和接收不會阻塞的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

    TD-HSUPA系統的TCP優化方法

    本文提出了一種TD-HSUPA系統的TCP優化方法:利用無線網絡控制器RNC(Radio Network Controller)解析TCP連接鏈路上服務器的反饋包信息。本
    發表于 08-03 11:30 ?2817次閱讀
    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 ?381次閱讀
    <b class='flag-5'>一種</b><b class='flag-5'>簡單</b>高效配置FPGA的<b class='flag-5'>方法</b>