乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      lwIP(V1.3.0) RAW TCP/IP接口

       心不留意外塵 2016-06-24

      lwIP RAW TCP/IP接口

      http://blog.csdn.net/zhzht19861011/article/details/6218994

      2011

      作者: Adam Dunkels, Leon Woestenberg, Christiaan Simons

       

      lwIP為使用TCP/IP協(xié)議通信的應(yīng)用程序編程提供了兩種接口接口(APIs):

      * 低層次的稱(chēng)之為"core" / "callback" 或者 "raw" API

      * 高層次的稱(chēng)之為"sequential" API

       

      lwIP "sequential" API為使用TCP/IP協(xié)議棧編程提供符合常規(guī)的、通用的途徑,它與BSD socket API非常相似。程序的執(zhí)行過(guò)程同樣是基于"open-read-write-close"模型的。從本質(zhì)上講,TCP/IP協(xié)議棧的通信過(guò)程是事件驅(qū)動(dòng)的,因此,TCP/IP的代碼和用戶(hù)應(yīng)用程序的代碼必須在不同的線程里面。

       

      **以下內(nèi)容討論"RAW" API**

       

      RAW IP允許應(yīng)用程序和TCP/IP代碼緊密結(jié)合,程序的執(zhí)行是基于在TCP/IP內(nèi)核中被調(diào)用的回調(diào)函數(shù)事件驅(qū)動(dòng)的。TCP/IP內(nèi)核和應(yīng)用程序可以運(yùn)行在同一線程。lwIP "sequential" API接口會(huì)消耗大量的CPU資源,它并不適用于小型嵌入式系統(tǒng),因?yàn)樗仨氝\(yùn)行在多線程環(huán)境中。

       

      RAW API不僅執(zhí)行速度快,而且消耗的內(nèi)存資源更少。它的缺點(diǎn)是應(yīng)用程序編寫(xiě)相對(duì)較難并不易理解。盡管如此,這種方式仍是資源較少的嵌入式系統(tǒng)的首選方法。

       

      不同的應(yīng)用程序中我們可以同時(shí)使用這兩種APIs,實(shí)際上"sequential" API就是由RAW API封裝后得到的。

       

      什么是回調(diào)函數(shù)?

      RAW API是基于回調(diào)函數(shù)所驅(qū)動(dòng)的。每一個(gè)回調(diào)函數(shù)實(shí)際上只是一個(gè)普通的C函數(shù),這個(gè)函數(shù)在TCP/IP內(nèi)核中被調(diào)用。每一個(gè)回調(diào)函數(shù)都作為一個(gè)參數(shù)傳遞給當(dāng)前TCPUDP連接。而且,為了能夠保存程序的特定狀態(tài),可以向回調(diào)函數(shù)傳遞一個(gè)指定的狀態(tài),并且這個(gè)指定的狀態(tài)是獨(dú)立于TCP/IP協(xié)議棧的。

       

      --應(yīng)用程序設(shè)置狀態(tài)函數(shù)

      - void tcp_arg(struct tcp_pcb *pcb, void *arg)

      指定傳給所有回調(diào)函數(shù)的特定狀態(tài)參數(shù)。參數(shù)"pcb"指當(dāng)前TCP連接控制塊,"arg"指?jìng)鬟f給回調(diào)函數(shù)的參數(shù)。

       

      --TCP連接函數(shù)

      這些函數(shù)用于建立連接,它們與"sequential" API以及BSD socket API非常相似。使用tcp_new()函數(shù)建立一個(gè)新的TCP標(biāo)識(shí)符(也就是協(xié)議控制塊-PCB)。這個(gè)PCB可以用來(lái)監(jiān)聽(tīng)一個(gè)外來(lái)的連接(譯注:作為服務(wù)器)也可以連接到另一個(gè)主機(jī)(譯注:作為客戶(hù)端)。

      - struct tcp_pcb *tcp_new(void)

      創(chuàng)建一個(gè)新的連接標(biāo)識(shí)符(PCB)。如果沒(méi)有有效的存儲(chǔ)空間創(chuàng)建這個(gè)新的pcb,返回NULL。

      譯注:這個(gè)函數(shù)創(chuàng)建一個(gè)TCP協(xié)議控制塊,但并不把它放到任何TCP PCB列表,直到使用tcp_bind()函數(shù)綁定。Tcp_new()函數(shù)會(huì)調(diào)用tcp_alloc函數(shù)來(lái)動(dòng)態(tài)申請(qǐng)一塊內(nèi)存并初始化它,之后將這塊內(nèi)存的首地址返回給tcp_new()函數(shù),如果動(dòng)態(tài)內(nèi)存不成功的話返回NULL

       

      - err_t tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr,

      u16_t port)

      pcb綁定一個(gè)本地IP地址和端口號(hào)。如果參數(shù)"ipaddr"IP_ADDR_ANY,則為這個(gè)pcb綁定任意本地IP地址。

      譯注:這個(gè)函數(shù)的大部分代碼用于檢驗(yàn)給出的IP地址和端口號(hào)是否合適,如果合適則將給出的IP地址和端口號(hào)賦給當(dāng)前PCB,更新已綁定tcp_pcb列表并返回ERR_OK.如果給出的參數(shù)不合適,則返回ERR_USE(表示端口已被使用)。

      參數(shù)ipaddr如果為IP_ADDR_ANY,表示綁定到任意本地地址,那么IP_ADDR_ANY是什么呢?lwip-1.3.0/src/include/ipv4/lwip/ip_addr.h中定義了:

       #define IP_ADDR_ANY         ((struct ip_addr *)&ip_addr_any)

       

      ip_addr_any是一個(gè)ip_addr型變量,lwip-1.3.0/src/core/ipv4/ip_addr.c中有如下聲明:

                      #define IP_ADDR_ANY_VALUE 0x00000000UL

      const struct ip_addr ip_addr_any = { IP_ADDR_ANY_VALUE };

      所以, IP_ADDR_ANY是等于0x00000000UL. IP地址上規(guī)定  0.0.0.0為廣播地址,也就是任意地址的意思。

       

      - struct tcp_pcb *tcp_listen(struct tcp_pcb *pcb)

      指定一個(gè)PCB進(jìn)入監(jiān)聽(tīng)狀態(tài)。當(dāng)一個(gè)遠(yuǎn)端連接訪問(wèn)時(shí),函數(shù) tcp_accept()指定的回調(diào)函數(shù)將被調(diào)用。在調(diào)用這個(gè)函數(shù)之前一定要使用tcp_bind()函數(shù)綁定一個(gè)本地IP和端口號(hào)。

       tcp_listen() 函數(shù)返回一個(gè)新的連接標(biāo)識(shí)符,原始的pcb會(huì)被釋放,這是為了節(jié)省內(nèi)存,使之更適合小內(nèi)存系統(tǒng)。

      如果監(jiān)聽(tīng)連接的內(nèi)存無(wú)效,tcp_listen()函數(shù)返回NULL,如果這樣的話,傳入的PCB參數(shù)將不會(huì)被釋放。

      這個(gè)函數(shù)從原理上看也比較簡(jiǎn)單,首先是做一些必要的檢查,判斷原始pcb是否已經(jīng)處于連接狀態(tài),如果沒(méi)有則申請(qǐng)一塊tcp_pcb類(lèi)型的內(nèi)存,將原始的必要的pcb內(nèi)容復(fù)制到新的pcb,設(shè)置新的pcb狀態(tài)為LISTEN,釋放原始的pcb,并將新pcb連接放入已監(jiān)聽(tīng)隊(duì)列。

       

      - struct tcp_pcb *tcp_listen_with_backlog(struct tcp_pcb *pcb, u8_t backlog)

      這個(gè)函數(shù)和tcp_listen()函數(shù)相同,只是限制了TCP監(jiān)聽(tīng)隊(duì)列連接個(gè)數(shù),這個(gè)個(gè)數(shù)由backlog參數(shù)指定。為了使用它,你必須在你的lwipopt.h中設(shè)置TCP_LISTEN_BACKLOG=1

       

      - void tcp_accepted(struct tcp_pcb *pcb)

      通知lwIP一個(gè)傳入的連接已經(jīng)被接受。通常這個(gè)函數(shù)在“accept()”函數(shù)的回調(diào)函數(shù)中被調(diào)用。這允許lwIP處理自身內(nèi)部的任務(wù)。比如,允許更多傳入的連接進(jìn)入監(jiān)聽(tīng)隊(duì)列。

      - void tcp_accept(struct tcp_pcb *pcb,

      err_t (* accept)(void *arg, struct tcp_pcb *newpcb,

      err_t err))

      指定應(yīng)在偵聽(tīng)連接上的一個(gè)新的連接到達(dá)時(shí)調(diào)用的回調(diào)函數(shù)。

       

      - err_t tcp_connect(struct tcp_pcb *pcb, struct ip_addr *ipaddr,

      u16_t port, err_t (* connected)(void *arg,

      struct tcp_pcb *tpcb,

      err_t err));

      設(shè)置打開(kāi)連接的pcb連接到遠(yuǎn)程主機(jī)并發(fā)送初始的SYN段。

      函數(shù)tcp_connect() 會(huì)立即返回;它并不等待這個(gè)連接是否被正確設(shè)置。相反的,當(dāng)連接正確建立后它將調(diào)用第四個(gè)參數(shù)("connected"參數(shù))指定的函數(shù)。如果這個(gè)連接不能正確的建立,可能是主機(jī)拒絕這個(gè)連接或者主機(jī)沒(méi)有響應(yīng),"connected"函數(shù)將被調(diào)用并設(shè)置一個(gè)相應(yīng)的參數(shù)。

      當(dāng)入隊(duì)的SYN段內(nèi)存不可用時(shí),tcp_connect()函數(shù)能返回ERR_MEM,表示連接沒(méi)有正確建立。如果SYN成功入隊(duì),tcp_connect()函數(shù)返回ERR_OK。

       

       

      ---TCP數(shù)據(jù)發(fā)送函數(shù)

       

      lwIP會(huì)調(diào)用tcp_write()函數(shù)來(lái)發(fā)送隊(duì)列中的數(shù)據(jù)。當(dāng)數(shù)據(jù)成功的發(fā)送到遠(yuǎn)程主機(jī),會(huì)調(diào)用一個(gè)指定的回調(diào)函數(shù)來(lái)通知應(yīng)用程序。

       

      - err_t tcp_write(struct tcp_pcb *pcb, void *dataptr, u16_t len,

      u8_t copy)

      參數(shù)"dataptr"指向數(shù)據(jù)隊(duì)列;參數(shù)"len"傳遞數(shù)據(jù)的長(zhǎng)度;參數(shù)"copy"的值為0或者1,表明是否需要申請(qǐng)新的內(nèi)存用于數(shù)據(jù)的拷貝。如果這個(gè)參數(shù)為0,則不需要申請(qǐng)新的內(nèi)存,此時(shí)數(shù)據(jù)只能使用指針來(lái)引用。

       如果數(shù)據(jù)長(zhǎng)度超過(guò)當(dāng)前發(fā)送緩存字節(jié)數(shù)或者要發(fā)送的段隊(duì)列長(zhǎng)度超過(guò)lwipopts.h中定義的上限值,tcp_write()函數(shù)執(zhí)行失敗并返回ERR_MEN??梢允褂?/span>tcp_sndbuf()函數(shù)來(lái)返回輸出隊(duì)列有效的字節(jié)數(shù)。

      使用這個(gè)函數(shù)的正確方法是根據(jù)tcp_sndbuf() 函數(shù)返回的字節(jié)數(shù)來(lái)發(fā)送數(shù)據(jù)。如果函數(shù)返回ERR_MEM,應(yīng)用程序應(yīng)該等待直到當(dāng)前隊(duì)列數(shù)據(jù)成功的被遠(yuǎn)程主機(jī)收到然后嘗試重新發(fā)送一次。

       

      - void tcp_sent(struct tcp_pcb *pcb,

      err_t (* sent)(void *arg, struct tcp_pcb *tpcb,

      u16_t len))

      當(dāng)遠(yuǎn)程主機(jī)成功接收(也就是應(yīng)答信號(hào))到數(shù)據(jù)時(shí),該函數(shù)指定的回調(diào)函數(shù)被調(diào)用。傳送給回調(diào)函數(shù)的"len"參數(shù)給出了上一次已經(jīng)被確認(rèn)的發(fā)送的最大字節(jié)數(shù)。

       

       

      --TCP數(shù)據(jù)接收函數(shù)

      TCP數(shù)據(jù)接收是基于回調(diào)函數(shù)的---當(dāng)一個(gè)新的數(shù)據(jù)接收到時(shí),應(yīng)用程序指定的回調(diào)函數(shù)被調(diào)用。當(dāng)應(yīng)用程序接收到數(shù)據(jù)后,它必須調(diào)用tcp_recved()函數(shù)來(lái)指示接收數(shù)據(jù)的大小。

       

      - void tcp_recv(struct tcp_pcb *pcb,

      err_t (* recv)(void *arg, struct tcp_pcb *tpcb,

      struct pbuf *p, err_t err))

      當(dāng)接收到數(shù)據(jù)時(shí),本函數(shù)設(shè)置的回調(diào)函數(shù)將被調(diào)用。如果傳遞給回調(diào)函數(shù)一個(gè)NULL pbuf則說(shuō)明遠(yuǎn)程主機(jī)關(guān)閉了這個(gè)連接。如果函數(shù)正常運(yùn)行并且回調(diào)函數(shù)返回ERR_OK,則必須釋放這個(gè)pbuf,如果其它情況,必須保存這個(gè)pbuf,這樣才能讓lwIP內(nèi)核保存它以供應(yīng)用程序檢查并恢復(fù)錯(cuò)誤。

       

      - void tcp_recved(struct tcp_pcb *pcb, u16_t len)

      當(dāng)應(yīng)用程序接收到數(shù)據(jù)后必須調(diào)用這個(gè)函數(shù)。參數(shù)"len"表明接收到的數(shù)據(jù)的長(zhǎng)度。

       

       

      --- 應(yīng)用程序輪詢(xún)函數(shù)

      當(dāng)一個(gè)連接空的時(shí)候(也就是說(shuō),既沒(méi)有數(shù)據(jù)接收也沒(méi)有數(shù)據(jù)發(fā)送),lwIP會(huì)通過(guò)調(diào)用一個(gè)指定的回調(diào)函數(shù)來(lái)重復(fù)輪詢(xún)應(yīng)用程序。這可以用作一個(gè)看門(mén)狗定時(shí)器,用來(lái)終止空閑時(shí)間太長(zhǎng)的連接;或者用作等待內(nèi)存有效的一種方法。舉例來(lái)說(shuō),如果調(diào)用tcp_write()函數(shù)時(shí)因?yàn)閮?nèi)存無(wú)效而失敗,應(yīng)用程序可以使用輪詢(xún)功能在連接空閑的時(shí)候再次調(diào)用tcp_write()

       

      - void tcp_poll(struct tcp_pcb *pcb, u8_t interval,

      err_t (* poll)(void *arg, struct tcp_pcb *tpcb))

      指定輪詢(xún)間隔和應(yīng)用程序輪詢(xún)時(shí)調(diào)用的回調(diào)函數(shù)。這個(gè)間隔是以TCP粗粒度定時(shí)器為單位的,即500毫秒一次。如果參數(shù)"interval"的值為10,則意味著每5秒輪詢(xún)一次應(yīng)用程序。

       

       

      ---關(guān)閉和終止連接函數(shù)

       

      - err_t tcp_close(struct tcp_pcb *pcb)

      關(guān)閉連接。如果關(guān)閉的連接內(nèi)存無(wú)效,函數(shù)返回ERR_MEM,如果是這樣的話,應(yīng)用程序應(yīng)該等待并通過(guò)使用acknowledgment回調(diào)函數(shù)或者輪詢(xún)功能重新關(guān)閉連接。如果連接關(guān)閉成功,函數(shù)返回WRR_OK。

      TCP內(nèi)核調(diào)用tcp_close()后,參數(shù)"pcb"指定的連接被解除。

       

      - void tcp_abort(struct tcp_pcb *pcb)

      通過(guò)向遠(yuǎn)程主機(jī)發(fā)送一個(gè)RST(復(fù)位)段來(lái)終止連接。這個(gè)函數(shù)從不會(huì)失敗。

      如果這個(gè)連接因?yàn)橐粋€(gè)錯(cuò)誤而被終止,則應(yīng)用程序可以通過(guò)err回調(diào)函數(shù)靈活的處理這個(gè)事件。通常一個(gè)連接因錯(cuò)誤而終止的原因是內(nèi)存不足。這時(shí)使用tcp_err()函數(shù)設(shè)置的回調(diào)函數(shù)被調(diào)用。

       

      - void tcp_err(struct tcp_pcb *pcb, void (* err)(void *arg,

      err_t err))

      指定一個(gè)處理錯(cuò)誤的回調(diào)函數(shù),該回調(diào)函數(shù)不能得到本函數(shù)的"pcb"作為它的參數(shù),因?yàn)檫@個(gè)pcb可能已經(jīng)被解除。

       

      --- 低層次TCP接口

      在系統(tǒng)的較低層,TCP提供一個(gè)簡(jiǎn)單的接口。在系統(tǒng)初始化的時(shí)候,任何其他TCP函數(shù)被調(diào)用之前必須先調(diào)用tcp_init()函數(shù)。當(dāng)系統(tǒng)已經(jīng)運(yùn)行,兩個(gè)定時(shí)器函數(shù)tcp_fasttmr() tcp_slowtmr()必須定期被調(diào)用。tcp_fasttmr()函數(shù)必須每隔TCP_FAST_INTERVAL(定義在tcp.h中)個(gè)毫秒被調(diào)用一次,tcp_slowtmr() 函數(shù)必須每隔TCP_SLOW_INTERVAL個(gè)毫秒被調(diào)用一次。

       

       

      --- UDP 接口

      相比之下,UDP接口要比TCP接口類(lèi)似,但UDP在低層次的復(fù)雜程度上明顯比TCP簡(jiǎn)單。

       

      - struct udp_pcb *udp_new(void)ige

      創(chuàng)建一個(gè)用于UDP通訊的UDP pcb。這個(gè)pcb直到綁定本地地址或者連接到遠(yuǎn)程地址后才被激活。

       

      - void udp_remove(struct udp_pcb *pcb)

      刪除一個(gè)指定的連接。

       

      -err_t udp_bind(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

             pcb綁定一個(gè)本地地址。參數(shù)"ipaddr"IP_ADDR_ANY時(shí),指定可以監(jiān)聽(tīng)任何本地IP地址。這個(gè)函數(shù)一般都會(huì)返回ERR_OK。

       

      - err_t udp_connect(struct udp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)

             設(shè)置pcb連接到遠(yuǎn)程主機(jī)。這個(gè)函數(shù)不產(chǎn)生任何流量,僅設(shè)置pcb的遠(yuǎn)程地址。

       

      - err_t udp_disconnect(struct udp_pcb *pcb)

             刪除遠(yuǎn)程端的pcb。這個(gè)函數(shù)不產(chǎn)生任何流量,近視刪除pcb的遠(yuǎn)程地址。

       

      - err_t udp_send(struct udp_pcb *pcb, struct pbuf *p)

             發(fā)送pbuf結(jié)構(gòu)指針p指向的數(shù)據(jù)。這個(gè)pbuf不會(huì)被釋放。

       

      - void udp_recv(struct udp_pcb *pcb,

      void (* recv)(void *arg, struct udp_pcb *upcb,

      struct pbuf *p, struct

      ip_addr *addr,

      u16_t port),

      void *recv_arg)

      當(dāng)接收到一個(gè)數(shù)據(jù)包后,該函數(shù)指定的回調(diào)函數(shù)將被調(diào)用。

       

       

      ---系統(tǒng)初始化

             一個(gè)完整通用的lwIP初始化步驟是不可能實(shí)現(xiàn)的,因?yàn)樗€取決于配置文件(lwipopts.h)的編寫(xiě)以及初始化額外運(yùn)行時(shí)的環(huán)境(例如硬件定時(shí)器)。

      當(dāng)你使用RAW API時(shí),我們可以給你一些建議。

      我們假設(shè)你使用一個(gè)單一的以太網(wǎng)netifUDPTCP傳輸層、IPv4DHCP客戶(hù)端。

      安以下順序調(diào)用這些函數(shù):

      - stats_init()

      清楚運(yùn)行時(shí)被收集的統(tǒng)計(jì)結(jié)構(gòu)。

      - sys_init()

      沒(méi)有多大用處,因?yàn)槲覀冊(cè)?/span>lwipopts.h中設(shè)置NO_SYS 1

      Not of much use since we set the NO_SYS 1 option in lwipopts.h, to be called for easy

      configuration changes.

       

      - mem_init()

      通過(guò)定義MEM_SIZE初始化動(dòng)態(tài)存儲(chǔ)堆

       

      - memp_init()

      通過(guò)定義MEMP_NUM_x初始化內(nèi)存池。

       

      - pbuf_init()

      通過(guò)定義PBUF_POOL_SIZE初始化pbuf內(nèi)存池。

       

      - etharp_init()

      初始化ARP表和隊(duì)列。

      注:在這個(gè)初始化之后你必須每隔 ARP_TMR_INTERVAL(5)個(gè)周期間隔調(diào)用etharp_tmr 函數(shù)。

       

      - ip_init()

      不常用,處理將要放生的改變時(shí)被調(diào)用。

       

      - udp_init()

      清除UDP PCB列表。

      - tcp_init()

      清除TCP PCB列表并清除一些內(nèi)部定時(shí)器。

      注:在這個(gè)初始化函數(shù)之后,你必須按預(yù)先確定的每個(gè)周期內(nèi)調(diào)用tcp_fasttmr() tcp_slowtmr()函數(shù)。

       

      - netif_add(struct netif *netif, struct ip_addr *ipaddr,

      struct ip_addr *netmask, struct ip_addr *gw,

      void *state, err_t (* init)(struct netif *netif),

      err_t (* input)(struct pbuf *p, struct netif *netif))

      netif_list列表中增加你的網(wǎng)絡(luò)接口。分配一個(gè)netif結(jié)構(gòu)體并傳遞一個(gè)指向這個(gè)結(jié)構(gòu)體的指針作為第一個(gè)參數(shù)。當(dāng)使用DHCP時(shí)給定的ip_addr結(jié)構(gòu)體會(huì)被清除,或者用其它數(shù)據(jù)填充它們。"state"指針可能為NULL。

      函數(shù)指針"init"必須指向你的以太網(wǎng)netif接口初始化函數(shù),下面舉例說(shuō)用該函數(shù)的應(yīng)用。

      err_t netif_if_init(struct netif *netif)

      {

      u8_t i;

      for(i = 0; i < ETHARP_HWADDR_LEN; i++) netif->hwaddr[i] = some_eth_addr[i];

      init_my_eth_device();

      return ERR_OK;

      }

      為使用以太網(wǎng)驅(qū)動(dòng)器(For ethernet drivers),函數(shù)指針"input"必須指向"netif/etharp.h"中聲明的ethernet_input() 函數(shù)。其它驅(qū)動(dòng)器(Other drivers)必須使用"lwip/ip.h"中聲明的ip_input()函數(shù)。

       

      - netif_set_default(struct netif *netif)

      注冊(cè)默認(rèn)網(wǎng)絡(luò)接口

       

      - netif_set_up(struct netif *netif)

      當(dāng)netif完全配置后,這個(gè)函數(shù)必須被調(diào)用。

       

      - dhcp_start(struct netif *netif)

      在第一次調(diào)用時(shí)為這個(gè)接口創(chuàng)建一個(gè)新的DHCP客戶(hù)端。

      注:?jiǎn)?dòng)這個(gè)客戶(hù)端后你必須按照預(yù)先設(shè)定的間隔周期性的調(diào)用dhcp_fine_tmr() dhcp_coarse_tmr()函數(shù)。

             你可以通過(guò)結(jié)構(gòu)體netif->dhcp查看真實(shí)的DHCP狀態(tài)。

       

       

      --- 優(yōu)化提示

             首先要做的是優(yōu)化src/core/inet.c中的lwip_standard_checksum()程序。你可以使用

      #define LWIP_CHKSUM  <your_checksum_routine>

      來(lái)重寫(xiě)這個(gè)標(biāo)準(zhǔn)函數(shù)。

      inet.c中使用C語(yǔ)言編寫(xiě)的例子,你也可以使用匯編語(yǔ)言編寫(xiě)。

      RFC1071是這個(gè)主題的很好的介紹。

      如果你使用小端處理器,另一個(gè)有效的改善是用匯編語(yǔ)言或者內(nèi)聯(lián)函數(shù)代替htons() htonl()函數(shù)。

      #define LWIP_PLATFORM_BYTESWAP 1

      #define LWIP_PLATFORM_HTONS(x)  <your_htons>

      #define LWIP_PLATFORM_HTONL(x)  <your_htonl>

             如果你的網(wǎng)絡(luò)讀到的速度比最大線速還要大,檢查你的網(wǎng)絡(luò)接口。如果硬件不能提供良好的服務(wù),會(huì)經(jīng)??焖俚陌l(fā)生緩沖區(qū)溢出現(xiàn)象。舉例來(lái)說(shuō),當(dāng)使用cs8900處理器時(shí),調(diào)用cs8900if_service(ethif)函數(shù)可能很頻繁出現(xiàn)上述現(xiàn)象。當(dāng)使用的RTOS允許cs8900使用中斷喚醒一個(gè)服務(wù)于一個(gè)你的使用一個(gè)二進(jìn)制信號(hào)量或事件標(biāo)志的驅(qū)動(dòng)程序的高優(yōu)先級(jí)任務(wù)。

             當(dāng)產(chǎn)品發(fā)布時(shí),建議設(shè)置LWIP_STATS0

      注意速度性能的提高和多方面有關(guān),并不是簡(jiǎn)單的提高內(nèi)存的容量。

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶(hù) 評(píng)論公約

        類(lèi)似文章 更多