久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23769|回復: 5
收起左側

關于LWIP Raw TCP server 程序注意事項:stm32+enc28j60

[復制鏈接]
ID:262 發表于 2014-5-20 15:27 | 顯示全部樓層 |閱讀模式

這是一個牛人寫的轉過來
你要是想寫一個完整的TCPserver的程序,你可以把程序寫成電腦向你板子發送數據,然后板子將收到的數據回發給電腦。到后期再對收到的數據進行處理以達到你板子的需求。

這個收發程序的結果應該是能夠完整的將收到的數據完整的發送給電腦,不論你電腦發送的速度有多快,包有多大,一切的不成功都是你自身的原因,不要試圖降低發送頻率或者將包變小來解決問題。那都是治標不治本的做法。

我用的板子是stm32+enc28j60,網上有一堆移植教程,不過可能你會在移植中出現各種問題,而且有可能你遇到的問題網上還沒有,我建議有時間的話看看lwip的原理,這里推薦老衲五木的《LWIP協議詳解》,相當經典,看完之后至少茅斯頓開了一大半。不過有可能你沒有多少耐心去看完,就只能彷徨又著急的去四處求救了。

接下來說幾個注意事項:

1.硬件:

  • 要是初次移植LWIP,最好不要用路由器,因為那樣你的板子會收到很多不是你電腦發送的數據包,同時電腦發送包的速度快了之后有的路由器就會根據自己的流量控制可能會丟棄包等,雖然對于可靠性高的TCP來說一切都不是問題,但是初學者會因為很多不明不白的現象暈很久。
  • 最好不要用無線網來和板子通信,也就是板子插網線,你的筆記本接無線,然后兩個通過路由器進行數據的傳送,這樣會出現你的ping很不穩定,還容易出現連接超時等。
  • 你要是有條件就自己做一根電腦連接電腦形式的網線,直接將板子和電腦相連,這樣的通信在前期是很方便和可靠的,至少你可以將基礎的東西先調出來。同時要注意,要是筆記本的話,你可能插著網線又上著無線網,兩個網卡工作有很大概率出現你沒辦法連接上你的板子。所以最好在連著板子的時候斷掉無線網,或者在連接好板子并且端口之間連接上之后再打開無線網去上網也是可以得。

2.軟件

最好參考官方lwip包里的APP,我在跑官方的程序的時候沒有問題,但是看別人寫的程序,拿來用用的時候就出了一堆問題。初級的移植相關的內容我就不說了,主要說在寫TCPserver遇到的問題。

我在看別人寫的收發數據的server,出現了在傳輸大量數據且速度很快的情況下丟失數據乃至于多出數據的情況.TCP是一種可靠性非常高的傳輸協議,在告訴和大量數據的情況下,就算有丟包(肯定有stm32無法應答的情況)TCP也會重傳,而且有滑動窗口和阻塞窗口控制,能夠知道server還能接受多大的數據包,所以一切的失敗都不是TCP協議本身的問題,一定是硬件或者軟件上寫的有問題。

在這里先講一個TCP整個工作的大致流程:enc28j60得到包-->ARP層(分析數據包是否更新ARP列表以及是否傳輸到IP層)-->IP(對收到的包進行重組,因為包太大所以發送的時候進行了分片,現在接收自然要重組)-->TCP(得到一個完整的數據包,所以你就可以在回調函數里的pbuf變量上取你想要的數據進行處理)

寫server的時候盡量還是寫完整一點,也就是盡量處理好錯誤和一些意外的情況。現在講一下官方lwip中app的tcpecho_raw中需要注意的一些語句,這些語句你寫server的時候也要注意,不然災難不斷:

  • 當你接收到數據包的時候,比如 pbuf*p。你會取出temp->payload做相應的一些處理,然后可能還會做點別的事,當你做完之后你會釋放這個包:pbuf_free(p),在此之前你會取出這個包指向的下一個包的地址p->next,但還有一件事需要在pbuf_free之前完成以下,pbuf_ref(p->next)。因為釋放了p的話,p->next的引用也會被減一,可能就導致這個包也跟著被釋放了,乃至于后面串著的包都被釋放了,你就會發現現象就是你發回到電腦上的數據少了很多,發送一萬字節可能只有4000多。
  • 關于tcp_recved的使用,我看到很多人寫程序的時候基本上只要到了接收的回調函數里面,就在最前面加上tcp_recved(pcb,p->tot_len)。這個函數的作用是增加滑動窗口的大小,從而可以接收到更多字節的數據,有的師兄在接受一定數量的數據后無法得到數據了就是因為沒有調用這句話。但是這句話不能一概寫成tcp_recved(pcb,p->tot_len)。大家可以看看這個函數的說明在源代碼里面,這個函數應該是你處理了多少的數據包就把len取多大的字節數。而不是一味的將p->tot_len填寫進去,那樣的畫滑動窗口開太大了更加容易照成丟包,然后就老重發,不太好。具體可參考echo_send語句。
  • 關于tcp_write,這個函數其實是將你的數據放到一個隊列里,等以后再調用tcp_output發送出去,這里需要注意的是當你在你寫了多少字節進去不一定在抓包的時候看到多少字節的數據包,因為它有可能會等write幾次之后打包一起發送出去,還有個問題,在寫之前最后用tcp_sndbuf(tpcb)看看還能發送多少字節的數據,這個是查看發送緩沖區的大小的函數。當你大于這個區域的時候,你就應該等待下次再發送,而能自動讓你進行剩余數據發送的一個方法就是用tcp_sent的回調函數,當數據發送出去并得到了應答之后,lwip就會調用tcp_sent,你就可以在其回調函數里面寫剩余的發送數據的語句了。這個最好加上,不然小心數據丟失喲。
  • 盡量不要再lwip的應用程序里面寫printf的函數,也就是串口函數等等,因為這樣會拖延時間。因為拖延久了之后沒有應答客戶端,就會導致他重發,反正又亂了這樣,我之前有次加了prinrf,就會出現收發數據一段時間以后,數據就發不出去了,發數據的時候還是一個字節一個字節往外蹦,所以需謹慎。
回復

使用道具 舉報

ID:69572 發表于 2014-11-28 10:24 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

ID:70374 發表于 2014-12-12 15:53 | 顯示全部樓層
正在搞這個,學習下
回復

使用道具 舉報

ID:67175 發表于 2016-7-10 17:12 | 顯示全部樓層
學習學習
回復

使用道具 舉報

ID:137263 發表于 2016-8-31 20:52 | 顯示全部樓層
愚鈍的我,還是不明白
回復

使用道具 舉報

ID:650730 發表于 2019-12-13 15:59 | 顯示全部樓層
附件在哪里呢,有資料嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久五月婷 | 国产精品国产成人国产三级 | 青青久草 | 中文字幕成人av | 免费一级片 | 久久不卡日韩美女 | 在线黄 | 91亚洲国产成人久久精品网站 | 男女激情网站免费 | 黄色一级特级片 | 羞羞羞视频 | 成人在线中文字幕 | 一级毛片成人免费看a | 天天综合成人网 | 日韩欧美在线观看 | 国产精品久久久久久久久久妇女 | 午夜精品网站 | 911精品美国片911久久久 | 国产偷久久一级精品60部 | 成人久久18免费 | 国产成人精品一区二区三区四区 | 国产精品日韩在线观看一区二区 | 精品婷婷 | 国产欧美一区二区三区在线看蜜臀 | 欧美 日韩 亚洲91麻豆精品 | 涩涩鲁亚洲精品一区二区 | 久久精品亚洲精品国产欧美kt∨ | 国产欧美在线 | 成人av电影在线观看 | 最新伦理片 | 日韩中文字幕在线观看视频 | 午夜精品一区二区三区在线观看 | 久久精品免费一区二区三 | 国产午夜精品理论片a大结局 | 欧美1区 | 免费国产成人av | 免费一区| 天天天天天操 | 日韩视频中文字幕 | 欧美久久一区二区三区 | 精品av久久久久电影 |