0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于LwIP的TCP服務(wù)器設(shè)計(jì)

CHANBAEK ? 來源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-14 15:09 ? 次閱讀

前面我們實(shí)現(xiàn)了UDP服務(wù)器及客戶端以及基于其上的TFTP應(yīng)用服務(wù)器。接下來我們將實(shí)現(xiàn)同樣廣泛應(yīng)用的TCP協(xié)議各類應(yīng)用。

1 、 TCP****簡述

TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,由IETF的RFC 793定義。在簡化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能,與用戶數(shù)據(jù)報(bào)協(xié)議(UDP)是同一層內(nèi)的,另一個(gè)重要的傳輸協(xié)議。在因特網(wǎng)協(xié)議族(Internet protocol suite)中,TCP層是位于IP層之上,應(yīng)用層之下的中間層。不同主機(jī)的應(yīng)用層之間經(jīng)常需要可靠的、像管道一樣的連接,但是IP層本身不提供這樣的流機(jī)制,而是提供不可靠的包交換,恰好TCP協(xié)議不足了這一應(yīng)用需求。

應(yīng)用層向TCP層發(fā)送用于網(wǎng)間傳輸?shù)?、?位字節(jié)表示的數(shù)據(jù)流,然后TCP把數(shù)據(jù)流分區(qū)成適當(dāng)長度的報(bào)文段。之后TCP把結(jié)果包傳給IP層,由它來通過網(wǎng)絡(luò)將包傳送給接收端實(shí)體的TCP層。TCP為了保證不發(fā)生丟包,就給每個(gè)包一個(gè)序號(hào),同時(shí)序號(hào)也保證了傳送到接收端實(shí)體的包的按序接收。然后接收端實(shí)體對(duì)已成功收到的包發(fā)回一個(gè)相應(yīng)的確認(rèn)(ACK);如果發(fā)送端實(shí)體在合理的往返時(shí)延(RTT)內(nèi)未收到確認(rèn),那么對(duì)應(yīng)的數(shù)據(jù)包就被假設(shè)為已丟失將會(huì)被進(jìn)行重傳。TCP用一個(gè)校驗(yàn)和函數(shù)來檢驗(yàn)數(shù)據(jù)是否有錯(cuò)誤;在發(fā)送和接收時(shí)都要計(jì)算校驗(yàn)和,以確保數(shù)據(jù)的正確性。TCP協(xié)議的數(shù)據(jù)包結(jié)構(gòu)如下:

TCP數(shù)據(jù)包中各部分的含義如下:

1 )源端口和目標(biāo)端口

源端口和目標(biāo)端口各占2個(gè)字節(jié)。用來告知主機(jī)該報(bào)文段是來自哪里以及傳送給哪里。進(jìn)行 TCP 通訊時(shí),客戶端通常使用系統(tǒng)自動(dòng)選擇的臨時(shí)端口號(hào),而服務(wù)器則根據(jù)應(yīng)用不同使用知名服務(wù)端口號(hào)。

2 )序列號(hào)

序列號(hào)占4個(gè)字節(jié)。 TCP是面向字節(jié)流的,在一個(gè) TCP 連接中傳輸?shù)淖止?jié)流中的每個(gè)字節(jié)都按照順序編號(hào)。 由于序列號(hào)由32位表示,所以最大值為2的32次方,序號(hào)增加到最大值的時(shí)候,下一個(gè)序號(hào)又回到了0。也就是說 TCP 協(xié)議可對(duì) 4GB 的數(shù)據(jù)進(jìn)行編號(hào),在一般情況下可保證當(dāng)序號(hào)重復(fù)使用時(shí),舊序號(hào)的數(shù)據(jù)早已經(jīng)通過網(wǎng)絡(luò)到達(dá)終點(diǎn)或者丟失了。

3 )確認(rèn)號(hào)

確認(rèn)號(hào)也是占4個(gè)字節(jié)。表示期望收到對(duì)方下一個(gè)報(bào)文段的序號(hào)值。 表明該序號(hào)之前的所有數(shù)據(jù)已經(jīng)正確無誤的收到。確認(rèn)號(hào)只有當(dāng)ACK標(biāo)志為1時(shí)才有效。

4 TCP****首部長度

TCP首部長度也稱為數(shù)據(jù)偏移占半個(gè)字節(jié) (4 位)。 它指出了 TCP報(bào)文段的數(shù)據(jù)起始處距離TCP報(bào)文的起始處有多遠(yuǎn)。當(dāng)了解了LwIP中TCP存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)后,會(huì)發(fā)現(xiàn)這個(gè)值是很有用的。

5 TCP****標(biāo)志位

TCP標(biāo)志位,一共有 6 個(gè),分別占 1 位,共 6 位 。每一位的值只有0和 1,分別表達(dá)不同意思。

  • URG 標(biāo)志 ,稱為緊急標(biāo)志,當(dāng)URG=1的時(shí)候,表示緊急指針有效。它告訴系統(tǒng)此報(bào)文段中有緊急數(shù)據(jù),應(yīng)盡快傳送,而不要按原來的排隊(duì)順序來傳送。URG標(biāo)志要與首部中的“緊急指針”字段配合使用。
  • ACK 標(biāo)志 ,稱為確認(rèn)標(biāo)志,當(dāng)ACK=1的時(shí)候,確認(rèn)號(hào)有效。一般稱帶有ACK標(biāo)志的TCP報(bào)文段為“確認(rèn)報(bào)文段”。TCP規(guī)定,在連接建立后所有傳送的報(bào)文段都必須把ACK設(shè)置為1。
  • PSH 標(biāo)志 ,稱為推送標(biāo)志,當(dāng)PSH = 1的時(shí)候,表示該報(bào)文段高優(yōu)先級(jí),接收方TCP應(yīng)該盡快推送給接收應(yīng)用程序,而不用等到整個(gè)TCP緩存都填滿了后再交付。
  • RST 標(biāo)志 ,稱為復(fù)位標(biāo)志,當(dāng)RST =1的時(shí)候,表示TCP連接中出現(xiàn)嚴(yán)重錯(cuò)誤,需要釋放并重新建立連接。一般稱攜帶RST標(biāo)志的TCP報(bào)文段為“復(fù)位報(bào)文段”。
  • SYN 標(biāo)志 ,稱為同步標(biāo)志,當(dāng)SYN = 1的時(shí)候,表明這是一個(gè)請(qǐng)求連接報(bào)文段。一般稱攜帶SYN標(biāo)志的TCP報(bào)文段為“同步報(bào)文段”。在TCP 三次握手中的第一個(gè)報(bào)文就是同步報(bào)文段,在連接建立時(shí)用來同步序號(hào)。 對(duì)方若同意建立連接,則應(yīng)在響應(yīng)的報(bào)文段中使SYN = 1和ACK = 1。
  • FIN 標(biāo)志 ,稱為終止標(biāo)志,當(dāng)FIN = 1時(shí),表示此報(bào)文段的發(fā)送方的數(shù)據(jù)已經(jīng)發(fā)送完畢,并要求釋放TCP連接。 一般稱攜帶FIN的報(bào)文段為“結(jié)束報(bào)文段”。在TCP四次揮手釋放連接的時(shí)候,就會(huì)用到該標(biāo)志。

6 )窗口大小

窗口大小占2字節(jié)。該字段明確指出了現(xiàn)在允許對(duì)方發(fā)送的數(shù)據(jù)量,它告訴對(duì)方本端的TCP接收緩沖區(qū)還能容納多少字節(jié)的數(shù)據(jù),這樣對(duì)方就可以控制發(fā)送數(shù)據(jù)的速度。窗口大小的值是指,從本報(bào)文段首部中的確認(rèn)號(hào)算起,接收方目前允許對(duì)方發(fā)送的數(shù)據(jù)量。

7 )校驗(yàn)和

校驗(yàn)和占2個(gè)字節(jié)。由發(fā)送端填充,接收端對(duì) TCP 報(bào)文段執(zhí)行 CRC 算法,以檢驗(yàn) TCP 報(bào)文段在傳輸過程中是否損壞,如果損壞這丟棄。檢驗(yàn)范圍包括首部和數(shù)據(jù)兩部分,這也是 TCP 可靠傳輸?shù)囊粋€(gè)重要保障。

8 )緊急指針

緊急指針占2個(gè)字節(jié)。僅在URG=1時(shí)才有意義,它指出本報(bào)文段中的緊急數(shù)據(jù)的字節(jié)數(shù)。 當(dāng)URG = 1時(shí),發(fā)送方TCP就把緊急數(shù)據(jù)插入到本報(bào)文段數(shù)據(jù)的最前面,而在緊急數(shù)據(jù)后面的數(shù)據(jù)仍是普通數(shù)據(jù)。因此,緊急指針指出了緊急數(shù)據(jù)的末尾在報(bào)文段中的位置。

2 、 TCP****服務(wù)器設(shè)計(jì)

我們已經(jīng)對(duì)TCP協(xié)議及其報(bào)文格式做了簡單說明,接下來我們將結(jié)合LwIP協(xié)議棧,使用RAW API實(shí)現(xiàn)一個(gè)TCP服務(wù)器的簡單應(yīng)用。

2.1 TCP相關(guān)的RAW API****函數(shù)

在開始實(shí)現(xiàn)TCP服務(wù)器之前,我們首先來看一看LwIP中與TCP相關(guān)的RAW API函數(shù)有哪些。并簡單的了解一下其功能。

2.1.1 、建立TCP連接的API函數(shù):

2.1.2 、發(fā)送TCP數(shù)據(jù)的API函數(shù):

2.1.3 、接收TCP數(shù)據(jù)的API函數(shù):

2.1.4 TCP輪詢API****函數(shù):

2.1.5 、關(guān)閉和中止TCP連接的API函數(shù):

2.2 TCP****服務(wù)器的工作流程

我們已經(jīng)了解了TCP所涉及到的API函數(shù),那么使用這些函數(shù)怎么實(shí)現(xiàn)一個(gè)TCP服務(wù)器呢?我們先簡單說明一下其基本的流程。

2.2.1 、新建控制塊

使用tcp_new()函數(shù)建立一個(gè)TCP控制塊。

2.2.2 、綁定控制塊

對(duì)于服務(wù)器來說,新建一個(gè)控制快后,需要在控制塊上綁定本地IP和端口,以方便客戶端的連接。

2.2.3 、控制塊偵聽

使用tcp_listen函數(shù),對(duì)于服務(wù)器來說,我們需要顯性調(diào)用tcp_listen函數(shù)以使控制塊進(jìn)入監(jiān)聽狀態(tài),等待客戶端的連接請(qǐng)求。

2.2.4 、建立連接

其實(shí)在我們調(diào)用tcp_listen函數(shù)進(jìn)入服務(wù)器監(jiān)聽狀態(tài)后,需要馬上使用tcp_accept函數(shù)來注冊(cè)一個(gè)接收處理函數(shù),因?yàn)橐坏┯锌蛻舳诉B接請(qǐng)求被成功建立后,服務(wù)器就會(huì)調(diào)用這個(gè)處理函數(shù)。

2.2.5 、接受并處理數(shù)據(jù)

一旦連接成功,accept回調(diào)函數(shù)會(huì)調(diào)用tcp_recv函數(shù)注冊(cè)一個(gè)接收完成的處理函數(shù)。對(duì)于服務(wù)器來說,接收到了客戶端的數(shù)據(jù)或操作要求,就會(huì)調(diào)用這一回調(diào)函數(shù)進(jìn)行處理。這其實(shí)是一個(gè)復(fù)雜的過程:接收到數(shù)據(jù)后,首先通知更新接受窗口(使用tcp_recved函數(shù)),處理并發(fā)送數(shù)據(jù)(使用tcp_write函數(shù)),數(shù)據(jù)發(fā)送成功則清除已發(fā)送的數(shù)據(jù)(使用tcp_sent函數(shù)),最后關(guān)閉連接(使用函數(shù)tcp_close)。

用流程圖表述如下:

在上述流程圖中我們列出了每一環(huán)節(jié)所用到的主要函數(shù),其他一些函數(shù)用到了但未列出,有興趣可以免查閱源碼或者看相關(guān)的手冊(cè)。

2.3 、常用端口

TCP所使用的端口有很多與UDP是相同的,也有一些不一樣。為了方便操作我們已經(jīng)將常用的端口以宏定義的形式存儲(chǔ)在一個(gè)文件中?,F(xiàn)將常用的端口列于下,我們也是使用下列端口來實(shí)現(xiàn)我們的操作。

在這里我們只是設(shè)計(jì)一個(gè)簡單的TCP服務(wù)器,并不設(shè)定任何復(fù)雜的應(yīng)用,所以我們選擇使用TCP回顯協(xié)議端口。

3 、 TCP****服務(wù)器實(shí)現(xiàn)

我們已經(jīng)分析了TCP服務(wù)器的工作流程,我們將其劃分為三個(gè)部分來實(shí)現(xiàn):首先是TCP服務(wù)器的初始化。其實(shí)現(xiàn)代碼如下:

1 /* TCP服務(wù)器初始化 */
 2 void Tcp_Server_Initialization(void)
 3 {
 4   struct tcp_pcb *tcp_server_pcb;
 5  
 6   /* 為tcp服務(wù)器分配一個(gè)tcp_pcb結(jié)構(gòu)體 */
 7   tcp_server_pcb = tcp_new();
 8  
 9   /* 綁定本地端號(hào)和IP地址 */
10   tcp_bind(tcp_server_pcb, IP_ADDR_ANY, TCP_SERVER_PORT);
11  
12   /* 監(jiān)聽之前創(chuàng)建的結(jié)構(gòu)體tcp_server_pcb */
13   tcp_server_pcb = tcp_listen(tcp_server_pcb);
14  
15   /* 初始化結(jié)構(gòu)體接收回調(diào)函數(shù) */
16   tcp_accept(tcp_server_pcb, TCPServerAccept);
17 }

其次是實(shí)現(xiàn)TCP服務(wù)器接收回調(diào)函數(shù),該函數(shù)為tcp_accept_fn類型,注冊(cè)到了監(jiān)聽控制塊的accept字段。在服務(wù)器上有新連接建立時(shí)就會(huì)被內(nèi)核調(diào)用。在這個(gè)函數(shù)中,我們必須要實(shí)現(xiàn)一個(gè)非常重要的功能,就是注冊(cè)TCP服務(wù)器數(shù)據(jù)接收處理函數(shù)。

1 /* TCP服務(wù)器接收回調(diào)函數(shù),當(dāng)客戶端建立連接后本函數(shù)被調(diào)用 */
2 static err_t TCPServerAccept(void *arg, struct tcp_pcb *pcb, err_t err)
3 {
4   /* 注冊(cè)接收回調(diào)函數(shù) */
5   tcp_recv(pcb, TCPServerCallback);
6  
7   return ERR_OK;
8 }

最后,不用說就是要實(shí)現(xiàn)TCP服務(wù)器的具體實(shí)現(xiàn)功能。這個(gè)函數(shù)其實(shí)就是我們前面注冊(cè)過的TCP服務(wù)器數(shù)據(jù)接收處理函數(shù)。這個(gè)函數(shù)是tcp_recv_fn類型。這是使用RAW API實(shí)現(xiàn)TCP服務(wù)器最重要的函數(shù),因?yàn)槲覀儗?shí)現(xiàn)的TCP服務(wù)器究竟有什么功能,完全依賴于這個(gè)函數(shù)及其所掉用的函數(shù)。

1 /* TCP服務(wù)器數(shù)據(jù)處理服務(wù)器回調(diào)函數(shù) */
 2 static err_t TCPServerCallback(void *arg, struct tcp_pcb *pcb, struct pbuf *tcp_recv_pbuf, err_t err)
 3 {
 4   struct pbuf *tcp_send_pbuf;
 5   char echoString[]="This is the client content echo:\\r\\n";
 6  
 7   if (tcp_recv_pbuf != NULL)
 8   {
 9     /* 更新接收窗口 */
10     tcp_recved(pcb, tcp_recv_pbuf->tot_len);
11  
12     /* 將接收的數(shù)據(jù)拷貝給發(fā)送結(jié)構(gòu)體 */
13     tcp_send_pbuf = tcp_recv_pbuf;
14     tcp_write(pcb,echoString, strlen(echoString), 1);
15     /* 將接收到的數(shù)據(jù)再轉(zhuǎn)發(fā)出去 */
16     tcp_write(pcb, tcp_send_pbuf->payload, tcp_send_pbuf->len, 1);
17  
18     pbuf_free(tcp_recv_pbuf);
19     tcp_close(pcb);
20   }
21   else if (err == ERR_OK)
22   {
23     return tcp_close(pcb);
24   }
25  
26   return ERR_OK;
27 }

這里我們只是實(shí)現(xiàn)了簡單的回環(huán)服務(wù)器操作功能,如果需要更為復(fù)雜的功能,甚至與更復(fù)雜的應(yīng)用層協(xié)議都可在此基礎(chǔ)上擴(kuò)展。

4 、結(jié)論

本篇我們基于LwIP實(shí)現(xiàn)了簡單的TCP服務(wù)器應(yīng)用。通過回調(diào)函數(shù)的實(shí)現(xiàn)方式,整個(gè)過程與UDP的實(shí)現(xiàn)基本類似。我們采用TCP客戶端軟件測試連接都沒有問題。如果想基于TCP服務(wù)器實(shí)現(xiàn)更為復(fù)雜的應(yīng)用,如Modbus TCP等只需要在回調(diào)函數(shù)中實(shí)現(xiàn)響應(yīng)的功能就可以了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 服務(wù)器
    +關(guān)注

    關(guān)注

    12

    文章

    9160

    瀏覽量

    85415
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1353

    瀏覽量

    79070
  • UDP
    UDP
    +關(guān)注

    關(guān)注

    0

    文章

    325

    瀏覽量

    33937
  • LwIP
    +關(guān)注

    關(guān)注

    2

    文章

    86

    瀏覽量

    27168
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    為什么我的lwip tcp服務(wù)器跑50分鐘左右就卡死了?

    查了好多資料,改了很多地方,還是不行,請(qǐng)大神幫忙指點(diǎn)下是什么地方的原因。tcp服務(wù)器和客戶端連接50分鐘左右就卡死了,但是定時(shí),還有串口都能正常使用,是不是lwip的配置或是緩沖有
    發(fā)表于 07-17 02:54

    如何用LWIP進(jìn)行遠(yuǎn)程服務(wù)器連接

    平臺(tái)F107+LWIP1.4.1情景:設(shè)備通過TCP去連接遠(yuǎn)程服務(wù)器問題:國內(nèi)的服務(wù)器可以瞬間連接上(秒級(jí)),國外的服務(wù)器需要很長時(shí)間才可以
    發(fā)表于 07-18 01:37

    STM32F407以太網(wǎng)例程中AD任務(wù)無法運(yùn)行是怎么回事?

    我在原子哥的第十章lwipTCP服務(wù)器實(shí)驗(yàn)中的例程里加了個(gè)AD采集的任務(wù)。單獨(dú)運(yùn)行時(shí)以太網(wǎng)沒問題,AD也沒問題。同時(shí)運(yùn)行時(shí)只有以太網(wǎng)可以AD任務(wù)始終沒運(yùn)行,我AD任務(wù)的ucos優(yōu)先級(jí)已經(jīng)高于以太網(wǎng)
    發(fā)表于 08-26 23:46

    LWIP_UCOSIII TCP服務(wù)器分享!

    此次分享的 在上次TCP客戶端的基礎(chǔ)上 增加了TCP服務(wù)器端支持并發(fā)功能最大客戶端數(shù)量 (默認(rèn)為5個(gè))同樣參照原子大神 跟野火大神 的程序因本人水平有限 如有錯(cuò)誤 請(qǐng)指正申明下 硬件平臺(tái)F407+DM9161
    發(fā)表于 10-12 10:22

    LWIP tcp連接服務(wù)器超時(shí)該怎么辦?

    問一下在LWIP, netconn 使用TCP連接服務(wù)器,有沒有設(shè)置連接超時(shí)的函數(shù)或參數(shù),又或者怎么才能讓它連接不上快速退出呢
    發(fā)表于 10-31 04:35

    基于lwipTCP客戶端同時(shí)連接雙服務(wù)器連接不上

    ],lwipdev.wdip[1], lwipdev.wdip[2],lwipdev.wdip[3]);//服務(wù)器2ipwhile (1) { tcp_clientconn = netconn_new
    發(fā)表于 03-25 02:03

    測試echo服務(wù)器lwip時(shí)出現(xiàn)問題的解決辦法?

    嗨,我想利用sdk測試echo服務(wù)器lwip,fpga程序并運(yùn)行configration。但是,在控制臺(tái)中,有一些行讓我感到困惑。----- lwIP TCP echo
    發(fā)表于 05-12 07:58

    【正點(diǎn)原子FPGA連載】第三十四章基于lwipTCP服務(wù)器性能測試實(shí)驗(yàn)-領(lǐng)航者 ZYNQ 之嵌入式開發(fā)指南

    原子公眾號(hào),獲取最新資料第三十四章基于lwipTCP服務(wù)器性能測試實(shí)驗(yàn)上一章的lwip Echo Server實(shí)驗(yàn)讓我們對(duì)lwip有一個(gè)基
    發(fā)表于 09-08 11:04

    TCP服務(wù)器創(chuàng)建過程

    用過正點(diǎn)原子LWIP服務(wù)器例程開發(fā)的朋友可能知道,例程的設(shè)計(jì)是只支持一個(gè)客戶端連接的,但實(shí)際應(yīng)用中往往需要用到多客戶端連接。下面是在正點(diǎn)原子擴(kuò)展例程網(wǎng)絡(luò)實(shí)驗(yàn)14 NETCONN_TCP 服務(wù)器
    發(fā)表于 08-24 08:03

    用freertos和LWIP開發(fā)一個(gè)服務(wù)器端的TCP/IP服務(wù)

    我在工作中需要在STM32F2系列下,用freertos和LWIP開發(fā)一個(gè)服務(wù)器端的TCP/IP服務(wù)。由于內(nèi)存有限并且freertos不便于利用fork函數(shù)新建線程,因此采用了sele
    發(fā)表于 08-24 07:30

    如何去實(shí)現(xiàn)stm32f107vc lwip tcp客戶端服務(wù)器的數(shù)據(jù)傳輸呢

    怎么去建立LWIP客戶端模式呢?如何去實(shí)現(xiàn)stm32f107vc lwip tcp客戶端服務(wù)器的數(shù)據(jù)傳輸呢?
    發(fā)表于 11-04 06:54

    請(qǐng)問如何向客戶端發(fā)送數(shù)據(jù)LwIP tcp服務(wù)器?

    */tcp_echoserver_pcb = tcp_listen( tcp_echoserver_pcb ); /* initialize LwIP
    發(fā)表于 12-27 07:19

    LWIP運(yùn)行時(shí)出現(xiàn)hardfault cJSON cJSON_CreateObject()是怎么回事?

    打電話時(shí)我遇到了一個(gè)非常煩人的硬故障 cJSON_CreateObject(...) 在 LWIP TCP 服務(wù)器啟動(dòng)并運(yùn)行時(shí)從 cJSON 庫獲取。如果未輪詢 LWIP,則 json
    發(fā)表于 04-06 08:40

    STM32+LWIP服務(wù)器實(shí)現(xiàn)多客戶端連接

    用過正點(diǎn)原子LWIP服務(wù)器例程開發(fā)的朋友可能知道,例程的設(shè)計(jì)是只支持一個(gè)客戶端連接的,但實(shí)際應(yīng)用中往往需要用到多客戶端連接。下面是在正點(diǎn)原子擴(kuò)展例程 網(wǎng)絡(luò)實(shí)驗(yàn)14 NETCONN_TCP
    發(fā)表于 12-23 19:59 ?61次下載
    STM32+<b class='flag-5'>LWIP</b><b class='flag-5'>服務(wù)器</b>實(shí)現(xiàn)多客戶端連接

    基于LwIPTCP客戶端設(shè)計(jì)

    上一篇我們基于LwIP協(xié)議棧的RAW API實(shí)現(xiàn)了一個(gè)TCP服務(wù)器的簡單應(yīng)用,接下來一節(jié)我們來實(shí)現(xiàn)一個(gè)TCP客戶端的簡單應(yīng)用。
    的頭像 發(fā)表于 12-14 15:12 ?2283次閱讀
    基于<b class='flag-5'>LwIP</b>的<b class='flag-5'>TCP</b>客戶端設(shè)計(jì)