Commit 74bc5ec7 by NitefullWind

1. 接收数据时,如果有消息头,则根据消息头内指定长度循环接收。

parent 89c1c338
......@@ -55,17 +55,55 @@ void FMPVipServer::onDisconnected()
void FMPVipServer::onReadyRead()
{
QByteArray recvData = socket->readAll();
QByteArray recvData;
int needLen = -1, totalLen=0, dataLen = 0;
if(isNeedSocketHeader) {
FMSOCKEHEADER header = {0};
memcpy(&header, recvData.data(), sizeof(FMSOCKEHEADER));
if(header.flag != FMSOCKFLAG) {
FMP_WARN() << "Incompatible protocol.";
return;
while(needLen == -1 || totalLen < needLen)
{
// 如果不是第一次接收数据,则阻塞
if(totalLen > 0) {
bool isNext = socket->waitForReadyRead(30*1000);
if(!isNext) {
FMP_ERROR() << "Wait recv data time out. Recved length: " << totalLen << " need length: " << needLen << " Recved data: " << recvData;
socket->close();
socket->deleteLater();
socket = nullptr;
return;
}
}
QByteArray tempData = socket->readAll();
totalLen += tempData.size();
recvData.append(tempData);
if(isNeedSocketHeader) {
// 消息头接收完成
if(needLen == -1 && totalLen >= sizeof(FMSOCKEHEADER)) {
FMSOCKEHEADER header = {0};
memcpy(&header, recvData.data(), sizeof(FMSOCKEHEADER));
if(header.flag != FMSOCKFLAG) {
FMP_ERROR() << "Incompatible protocol. Recved data: " << recvData;
socket->close();
socket->deleteLater();
socket = nullptr;
return;
} else {
dataLen = header.len;
needLen = header.len + sizeof(FMSOCKEHEADER);
}
}
} else {
dataLen = tempData.size();
needLen = tempData.size();
}
}
if(isNeedSocketHeader) {
recvData = recvData.mid(sizeof(FMSOCKEHEADER));
}
if(totalLen > needLen) {
FMP_WARN() << "Recv total length: " << totalLen << " need length: " << needLen;
recvData = recvData.mid(0, dataLen);
}
QByteArray rspData;
dispatcher->doTask(recvData, rspData);
......
......@@ -5,7 +5,7 @@
#define VER_MINOR 1
#define VER_REVISION 0
#define VER_BUILD 27
#define VER_BUILD 28
//! Convert version numbers to string
#define _STR(S) #S
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment