18,356
社区成员
发帖
与我相关
我的任务
分享
//客户端数据解析(前4个字节是协议含解析MD5校验位,接着4字节是数据大小不包含MD5长度)
BOOL CDataSolver::DataAnalysis( PCHAR pDataAddr ,EPackageData& pPack ,BOOL& bNeedEncode )
{
if(pDataAddr == NULL)
return FALSE;
DWORD dwProtocol = 0;
memcpy(&dwProtocol ,pDataAddr ,sizeof(DWORD));
pPack.dwDataSize = 0;
pPack.dwProtocol = dwProtocol & (~PROT_ENCODE_MD5);
bNeedEncode = (dwProtocol & PROT_ENCODE_MD5) == PROT_ENCODE_MD5;
DWORD dwDataSize = 0;
switch (pPack.dwProtocol)
{
case 需要接收数据:
{
memcpy(&dwDataSize ,pDataAddr + sizeof(DWORD) ,sizeof(DWORD));
pPack.dwDataSize = dwDataSize;
dwDataSize = dwDataSize > MD_DATA_NORMAL_LENGTH ? 0 : dwDataSize;
if(bNeedEncode) //如果有MD5码,则拷贝MD5数据
{
pPack.pCodeAddr = new CHAR[MD_DATA_MD5_LENGTH + 1];
memcpy(pPack.pCodeAddr ,pDataAddr + MD_DATAHEAD_LENGTH ,MD_DATA_MD5_LENGTH);
pPack.pCodeAddr[MD_DATA_MD5_LENGTH] = '\0';
}
if(dwDataSize > 0)
{
pPack.pDataAddr = new CHAR[dwDataSize + 1];
DWORD dwLast = MD_DATAHEAD_LENGTH;
dwLast += bNeedEncode ? MD_DATA_MD5_LENGTH : 0;
memcpy(pPack.pDataAddr ,pDataAddr + dwLast,dwDataSize);
pPack.pDataAddr[dwDataSize] = '\0';
}
}
break;
}
return TRUE;
}
//服务端数据打包及传输
VOID CFunctionRuntime::SendData( EPackageData pPack ,SOCKET pSock)
{
DWORD dwDataSize = 0;
dwDataSize += sizeof(DWORD); //协议
dwDataSize += sizeof(DWORD); //数据长度
if(pPack.dwDataSize > 0)
{
dwDataSize += pPack.dwDataSize; //数据流长度
}
if( (pPack.dwProtocol & PROT_ENCODE_MD5) == PROT_ENCODE_MD5) //或运算,计算是否有MD5附加项
{
dwDataSize += MD_DATA_MD5_LENGTH; //MD5码长度
}
PCHAR pDataAddr = new CHAR[dwDataSize + 1];
memset(pDataAddr ,0 ,dwDataSize + 1);
memcpy(pDataAddr ,&pPack.dwProtocol ,sizeof(DWORD));
memcpy(&pDataAddr[4] ,&pPack.dwDataSize ,sizeof(DWORD)); //protocol + datasize 固定8个字节
if( (pPack.dwProtocol & PROT_ENCODE_MD5) == PROT_ENCODE_MD5
&& pPack.pCodeAddr)
{
memcpy(&pDataAddr[MD_DATAHEAD_LENGTH] ,pPack.pCodeAddr ,MD_DATA_MD5_LENGTH);
}
if(pPack,dwDataSize > 0 && pPack.pDataAddr)
{
DWORD dwLast = MD_DATAHEAD_LENGTH;
dwLast += ((pPack.dwProtocol & PROT_ENCODE_MD5) == PROT_ENCODE_MD5) ? MD_DATA_MD5_LENGTH : 0;
memcpy(&pDataAddr[dwLast] ,pPack.pDataAddr ,pPack.dwDataSize);
}
TcpCommAdapter::GetInstance()->SendData(pDataAddr ,dwDataSize ,pSock);
delete[] pDataAddr;
}
DWORD TcpCommAdapter::SendData( PCHAR pDataAddr ,DWORD dwDataSize ,SOCKET pSock )
{
DWORD dwSendSize = 0;
CGlobalInstance::GetInstance()->GlobalLock();
DWORD dwRemainSize = dwDataSize;
if(pDataAddr && IsServerAlive())
{
//while (dwRemainSize > 0)
//{
// dwSendSize = send(pSock ,pDataAddr ,dwRemainSize ,0);
// if(dwSendSize == 0 || dwSendSize == SOCKET_ERROR)
// {
// break;
// }
// dwRemainSize -= dwSendSize;
// pDataAddr += dwSendSize;
//}
//INT nSize = 0;
//setsockopt(pSock ,SOL_SOCKET ,SO_SNDBUF ,(CHAR*)&nSize ,sizeof(nSize));
dwSendSize = send(pSock ,pDataAddr ,dwRemainSize ,0);
}
CGlobalInstance::GetInstance()->GlobalUnlock();
return dwDataSize ;//== dwDataSize - dwRemainSize ? SD_SOCKET_SEND_SUCCESS : SD_SOCKET_SEND_ERR;
}