摘 要::LWIP是一款應(yīng)用與嵌入式領(lǐng)域的開源TCP/IP協(xié)議棧。在學(xué)習(xí)代碼實(shí)現(xiàn)中,學(xué)生遇到的第一個(gè)大問題就是tcp_write函數(shù),解釋了tcp_write函數(shù)背后的工作機(jī)理。
關(guān)鍵詞:LWIP;tcp_write函數(shù);工作機(jī)理
在一個(gè)簡單的TCP服務(wù)器實(shí)現(xiàn)代碼中,
1.pcb=tcp_new();/*建立TCP控制塊(pcb) */
2.tcp_bind(pcb,IP_ADDR_ANY,80);/*綁定IP和端口號(hào)*/
3.pcb=tcp_listen(pcb);/*進(jìn)入監(jiān)聽狀態(tài)*/
4.tcp_accept(pcb,http_accept);/*設(shè)置回調(diào)函數(shù)*/
在tcp_accept中調(diào)用了tcp_recv函數(shù)。
5.tcp_recv(pcb,http_recv);/*設(shè)置回調(diào)函數(shù)*/
在http_recv中調(diào)用了tcp_write函數(shù)。
6.tcp_write[pcb,http_html_hdr,sizeof(http_html_hdr),0];
/*發(fā)送http協(xié)議頭部信息*/
7.tcp_write[pcb,login,sizeof(login),0];
/*發(fā)送登錄網(wǎng)頁信息*/
在tcp_write中只是調(diào)用了tcp_enqueue函數(shù),構(gòu)造一個(gè)報(bào)文
段并放在控制塊緩沖隊(duì)列中,并沒有立即發(fā)送,而是等待數(shù)據(jù)集中一下然后再發(fā)送。那發(fā)送是在哪句代碼中體現(xiàn)呢?在網(wǎng)絡(luò)上和書本上,都無法找到明確的解釋。
在main函數(shù)中調(diào)用了LwIP_Periodic_Handle函數(shù),在這個(gè)函數(shù)中調(diào)用了tcp_tmr函數(shù),內(nèi)部又調(diào)用了tcp_slowtmr函數(shù),在這個(gè)函數(shù)中調(diào)用了tcp_output函數(shù)。而tcp_output就是發(fā)送代碼的函數(shù),問題也得以解決。
本文對(duì)簡單的TCP服務(wù)器代碼進(jìn)行分析,解決了tcp_write函數(shù)與發(fā)送數(shù)據(jù)之間關(guān)系的困惑。
參考文獻(xiàn):
[1]朱升林.嵌入式Linux網(wǎng)絡(luò)那些事[M].北京:中國水利水電出版社,2012-09.
[2]劉光然.零基礎(chǔ)arm裸板編程入門.湖北經(jīng)濟(jì)學(xué)院學(xué)報(bào):人文社會(huì)科學(xué)版,2013-02.
(作者單位 湖北省武漢市經(jīng)濟(jì)學(xué)院電子工程系)