1
这个客户端code.server连续发送数据。在这里我正在偷看13(Header Length)字节的消息,获取消息本身编码的数据的大小并创建缓冲区大小为MESSAGE_HEADER_LENGTH +数据长度。套接字Recv api返回意外值
获取总邮件大小后,我正在使用第二个recv从套接字读取数据。 在服务器到客户端之间的初始连接建立和交换hello消息时,它工作正常,但是当服务器发送连续流时说(当我们在客户端服务器上挂断按钮发送固定长度为5000ms的连续消息时)recv工作不正常并且recv缓冲区接收到以垃圾或一段时间为空的字符串之前的原始消息。
#define MESSAGE_HEADER_LENGTH 13
...
while {
nSelectRetVal = select(NULL, &fdRead,NULL, &fdExcept, &tv);
if(nSelectRetVal > 0) {
if(FD_ISSET(pControlMgr->GetConnectionMgr()->GetUDPSocket(),
&fdRead)) {
try {
char chHeaderBuffer[MESSAGE_HEADER_LENGTH + 1];
memset(chHeaderBuffer,0,MESSAGE_HEADER_LENGTH + 1);
int nMsgPeek = recv(pControlMgr->GetConnectionMgr()->GetUDPSocket(),
chHeaderBuffer, MESSAGE_HEADER_LENGTH, MSG_PEEK);
chHeaderBuffer[MESSAGE_HEADER_LENGTH] = '\0';
if(nMsgPeek == SOCKET_ERROR)
return 0;
CProtocolMgr objProtocolMgr;
int Bufferlength = objProtocolMgr.ProtocolMsgSize(chHeaderBuffer) + MESSAGE_HEADER_LENGTH;
pRecvBuffer = new char[Bufferlength];
memset(pRecvBuffer, 0, Bufferlength);
int nRecvRetVal = recv(pControlMgr->GetConnectionMgr()->GetUDPSocket(),
pRecvBuffer, Bufferlength, 0);
if(nRecvRetVal > 0) {
if(pControlMgr->HandlePacket(pRecvBuffer,
pControlMgr->GetConnectionMgr()->GetServerAddress()) == -1) {
if(NULL != pRecvBuffer) {
delete [] pRecvBuffer;
pRecvBuffer = NULL;
return 0 ;
}
} catch(...) {
if(NULL != pRecvBuffer) {
delete [] pRecvBuffer;
pRecvBuffer = NULL;
}
}
}
}
}
}
}
这是逻辑错误。现在它工作正常 – 2011-03-11 08:15:30