客户端没有数据时,recv出有关问题
客户端没有数据时,recv出问题
客户端没有发数据时,recv出问题了。 CAysncSocket写的。
最后一个问题了,就彻底解决了
大神帮忙解答。
------解决方案--------------------
“有时候客户端停了, 几分钟,也进步了这个if语句。”
这是对的啊,
std::map<std::string,COnLineUser*>::iterator iter=pThis->on_line_userMap.begin(); while(iter!=pThis->on_line_userMap.end())
{
}
这里超时,当时进if了。处理完后,从map 里删掉,下次就不进来了。“不要直接删去socket”,为什么不能删呢?客户端都停止了,close之后,这个socket已经没用了。
------解决方案--------------------
你在判断超时的时候,对于没有超时的客户端,为什么要更新其theLastTalkTime?
你postmessage的时候,参数是一个临时变量指针,这用法明显有很大的问题。
客户端没有发数据时,recv出问题了。 CAysncSocket写的。
最后一个问题了,就彻底解决了
大神帮忙解答。
- C/C++ code
unsigned int CMyServerDlg::ReceiveUserPacke(void*) { while(1) { if(WaitForSingleObject(pThis->hKillReceiveEvent,0)==WAIT_OBJECT_0) return 0; { CMutexHelper mtHelp(&mu); if(pThis->m_pCurSock==NULL) { continue; } } char rcvBuf[1000]; memset(rcvBuf,sizeof(rcvBuf),0); //这一句出错。 if(SOCKET_ERROR!=pThis->m_pCurSock->Receive(rcvBuf,sizeof(rcvBuf))) { //解析 CPacket* pPack=(CPacket*)rcvBuf; if(pPack->type==CPacket::HeartBeat) // 心跳包 { } else if(pPack->type==CPacket::Verification) //验证 { } else if(pPack->type==CPacket::Msg) //消息 { } } } return 0; }
------解决方案--------------------
“有时候客户端停了, 几分钟,也进步了这个if语句。”
这是对的啊,
std::map<std::string,COnLineUser*>::iterator iter=pThis->on_line_userMap.begin(); while(iter!=pThis->on_line_userMap.end())
{
}
这里超时,当时进if了。处理完后,从map 里删掉,下次就不进来了。“不要直接删去socket”,为什么不能删呢?客户端都停止了,close之后,这个socket已经没用了。
------解决方案--------------------
你在判断超时的时候,对于没有超时的客户端,为什么要更新其theLastTalkTime?
你postmessage的时候,参数是一个临时变量指针,这用法明显有很大的问题。