2014-10-31 134 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