在接受的一个游戏中,他们使用了ccsocket,但是有两个基本问题:第一个是无法保证每次的数据包都readfull(每次读完),第二个就是,有些功能服务器会连续发给客户端若干个数据包,客户端在读取第一个包得时候,就有可能读到下一个包的内容,这两个问题的解决办法我是这样写的:
/*
先读取包头,在读包长度
*/
void* SocketClient::recData(void *pthread)
{
for(;;)
{
try{
char bufHead;
memset(bufHead, 0, PACKET_HEAD_LEN);
char* pBufHead = (char*)bufHead;
readFull(PACKET_HEAD_LEN, &pBufHead);
short packetLen = SocketReader::readShort(&pBufHead);
char bufPacket;
memset(bufPacket, 0, packetLen);
char* pBufPacket = (char*)bufPacket;
readFull(packetLen, &pBufPacket);
short packetType = SocketReader::readShort(&pBufPacket);
printf("本包类型:%d \n", packetType);
Api::GetInstance()->funcByCode(packetType)(&pBufPacket);
}catch(...)
{
MessageTips::getSingleton()->popMessage(0,1001);
clearSocket();
printf(“接受数据错误-----> \n\n”);
break;
}
}
}
/*
这个函数保证会读满m个字节到dest buffer中
*/
void SocketClient::strmcat(char *dest, const char *str, int m)
{
char* tmpDest = dest;
for(int i=0; i< m; ++i)
{
tmpDest = str*;*
}
offset += m;
tmpDest = '\0';
}
有什么不正确地地方大家请指出来哈。