在TCP传输中丢失数据

时间:2014-10-31 16:39:02

标签: sockets tcp avr

我的问题是通过TCP数据传输丢失了数据。

我已经构建了一个基于AVR的自制网络服务器(或至少尝试过)。

我能够与客户端PC(我的PC)通信,并且我能够发送一些HTML行(总数据<100字节),没问题。

但是当我想发送我的基本主页(~1KB)时,我只获得了WireShark 181字节的数据。

我怀疑问题在于构建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字节

我设置了哪些设置错误?

2 个答案:

答案 0 :(得分:1)

TCP是一个流,并不能保证每个发送只会产生一个recv。您需要重复调​​用send直到发送所有字节,并且在另一端您还需要重复recv,在每个后续成功的recv上将新数据附加到缓冲区的末尾...您不能忽略来自发送/接收电话,您必须使用它来了解发送/接收的数据量。

答案 1 :(得分: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结束。