2014-10-31 81 views
0

我的問題是通過TCP數據傳輸丟失數據。在TCP傳輸丟失數據

我已經建立了一個自制的基於AVR的網絡服務器(或至少試圖)。

我能夠與客戶端PC(我的電腦)進行通信,並且我可以發送幾條HTML線(總數據爲< 100字節),沒有問題。

但是,當我想發送我的基本主頁(〜1KB)時,我只能獲得WireShark 181bytes的數據。

我懷疑問題在於TCP的構建。下面

數據是十六進制格式

從客戶端(我的電腦):

sequence number: de db c7 b1 

ack number: 00 0a 00 0b 

從服務器(AVR):

sequence number: 00 0a 00 0b 

ack number: de b6 c9 18 

總TCP長度:935byte,IP和TCP標題20-20字節

我設置了哪些設置錯誤?

回答

0

問題解決了!

ENC28J60_CS(); 
ENC28J60_CMD(WCR,ETXNDL); 
SPIWR(package_length); 
SPIWR(16+(package_length>>8)); 
ENC28J60_DS(); 

package_length是一個整數,ETXNDL(寄存器)也是如此。直到現在第二個SPIWR()函數只發送了值16:SPIWR(16); 所以問題是,我從未將package_length的高字節添加到16,所以芯片總是發送1-255字節長的包。

爲什麼16? RX緩衝區從0x0000開始,並在0x0fff結束。 TX緩衝區從0x1000開始,並在0x1fff結束。

1

TCP是一個流,並不能保證每次發送都會導致一個recv。您需要重複調​​用發送,直到發送完所有字節爲止,另一方面,您還需要重複recv,並在每次後續成功recv時將新數據附加到緩衝區的末尾......您不能忽略來自發送/接收呼叫,您必須使用它來知道有多少數據發送/ recvd。

+0

我想我的問題並不清楚。 我有一個大約1KB的頁面,所以它適合於一個TCP數據包。 這個數據包是通過AVR正確生成的,但是在傳輸過程中(LAN)只收到181byte。我知道數據包可能會丟失,但數據包的一部分?並在局域網?哦,我得到的大小總是181byte。 – 2014-10-31 19:00:01

+0

沒有TCP數據包這樣的東西,只有TCP數據流。在TCP中,您可以放心地忽略MTU。但是你不能忽略send和recv的返回碼。 – 2014-11-01 08:58:26