TCP和UDP是传输层中定义的两种传输协议。在网络编程中,第一个步骤就是为应用程序选择TCP还是UDP传输数据。
它们的区别简单说来就是:
TCP保证数据全部送到,不会丢失,但信息传输较慢。UDP不保证数据全部送到,但传输速度快。
回到上次的那个故事,嫖客完事之后付钱给妓女。于是妓女清点钞票,保证拿到了全额的服务费用。这,就是TCP。后来,妓女由于技巧高超,找她服务的嫖客越来越多,可以说是应接不暇。忙于接客的她头昏脑胀,无暇顾及每次是否都拿到了全部的费用,反正多赚一笔是一笔。等到她发觉钱收少了时,才再去找嫖客要。这,就是UDP。
我没有用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]
这样,收到三个包就都是完整而且可处理的了。
我靠,今天就写到这里,爽PSP去了。呼啦啦,果然用PSP看AV很赞。
过几天打算写个评psp,nds,wii,x360,PS3的文章。自从大三封笔以后,就很久没写评论游戏的东西了。最近买了PSP后,又有了一些感触。
