TCP 包完整性检验

文章出处:http://www.emlog.net/nemo/post-18.html

 

我没有用UDP编过程序,但是我看见过很多局域网游戏都是使用UDP。特别是对于实时响应一些要求很高的FPS来说,它们的发包量通常不大,但是需要很快的传输和响应速度。相反,大型的网络游戏通常都是用TCP。显而易见的是,因为广域网的游戏需要有一个更可高的网络传输环境。
我写的网络程序都是基于TCP的。不过,TCP虽然能够保证数据完整的收到,但是并不保证应用程序在每次调用recv()函数时收到的是一个完整的数据包。也就是说,可能会因为网络的各种状况导致只收到一次收到半个包或者超过1个包的数据。比如程序三次recv()收到的数据是这样的。
第一次:[a][a][a][a][a][b][b]
第二次:[b][b][b][c][c][c]
第三次:[c][c][d][d]
……
这时就需要对程序做包的完整性检测了,下面提供一个包完整性检测的伪代码,是公司的一位前辈教我的。说是伪代码,其实已经跟实际的代码差不多了。
//包完整性检测的伪代码
const int iNums=65536;
int buflen = 0
char Buffer[iNums];
bool succRec=fasel;

int len=recv()
memcpy(Buffer,recv_buf,len);
buflen += len;
if (buflen > Package_size)
{
   memcpy(Package,Buffer,Package_size); 
   memmove(Buffer,&Buffer[Package_size],Package_size);
   buflen -= Package_size;
   succRec=true;
}
if(succRec)
{
Process(Package);
}
这样的话,第一次收到数据并处理包后的缓冲区是:[b][b]
第二次就是:[c][c][c]
第三次就是:[d][d]
这样,收到三个包就都是完整而且可处理的了。

 

 

idnemo
2008-07-15 14:44
memcpy把已经收到的数据部分保存,然后使用memmove将Buffer缓冲区的指针前移,前移位置量是Package_size,所以应是一个Package_size大小.  ???
cai
2008-07-10 06:22
memmove(Buffer,&Buffer[Package_size],Package_size);
最后一个参数是否应改为:buflen -Package_size

你可能感兴趣的:(c,网络,tcp,buffer,网游,网络游戏)