不知是什么原因。客户端显示已经链接成功并且还成功发送了数据。为什么就是服务没有动静呢?下面是服务端接受的代码:if(bIsServer)//如果是服务器
{
while(true)
{
LINUX_WIN_LOCk_MUTEXLOCK(&(pServer->m_csLock));
timeout.tv_sec = 5;
timeout.tv_usec = 0;
socketIter = pServer->m_socketList.begin();
while(socketIter != pServer->m_socketList.end())
{
FD_SET((*socketIter)->GetSocket(), &fdread);
socketIter++;
}
FD_SET(ListenSocket, &fdread);
iMaxFD = pServer->GetMaxFD();
rc = select(iMaxFD, &fdread, NULL, NULL, &timeout);
if(rc == 0)
{
LINUX_WIN_LOCk_MUTEXUNLOCK(&(pServer->m_csLock));
continue;
}
else if(rc < 0)
{
//找到出问题的socket,在删除
socketIter = pServer->m_socketList.begin();
while( socketIter != pServer->m_socketList.end() )
{
if( (*socketIter)->GetSocket() == INVALID_SOCKET )
{
socketIter = pServer->m_socketList.erase(socketIter);
}
else
{
socketIter++;
}
}
LINUX_WIN_LOCk_MUTEXUNLOCK(&pServer->m_csLock);
continue;
}
else
{
socketIter = pServer->m_socketList.begin();
while(socketIter != pServer->m_socketList.end())
{
int socketFD = (*socketIter)->GetSocket();
if( FD_ISSET(socketFD, &fdread) )//发数据过来的socket
{
char *szSocketBuf = (*socketIter)->m_szRecvBuf;
unsigned int& uBufLen = (*socketIter)->m_uRecvLength;
//读取消息
int iLen = recv(socketFD, (szSocketBuf+uBufLen), RCV_SIZE*sizeof(char) - uBufLen, 0);
if(iLen == -1)
{
#ifdef WIN32
if(WSAGetLastError() == WSAEWOULDBLOCK)
#else
if(errno == EWOULDBLOCK || errno == EAGAIN)
#endif
{
socketIter++;
continue;
} else
{
cout << "关闭的socket套接字为" << (*socketIter)->m_hSocket << endl;
FD_CLR(socketFD, &fdread);
(*socketIter)->CloseSocket();
socketIter = pServer->m_socketList.erase(socketIter);
continue;
}
}
uBufLen += iLen;
char szNetBuffer[NET_HEAD_SIZE + MAX_SEND_SIZE];
do
{
NetMessageHead *pNetHead = (NetMessageHead*)szSocketBuf;
unsigned long uMessageSize = pNetHead->uMessageSize;
if( (uBufLen < NET_HEAD_SIZE) || (uBufLen < uMessageSize) )
{
socketIter++;
break;
}
if(uMessageSize > (NET_HEAD_SIZE + MAX_SEND_SIZE))
{
socketIter++;
//丢弃这个包
memmove(szSocketBuf, szSocketBuf+uMessageSize, (uBufLen - uMessageSize)*sizeof(char) );
uBufLen -= uMessageSize;
break;
}
memcpy(szNetBuffer, szSocketBuf, uMessageSize);
memmove(szSocketBuf, szSocketBuf+uMessageSize, (uBufLen - uMessageSize)*sizeof(char) );
uBufLen -= uMessageSize;
uMessageSize -= NET_HEAD_SIZE;
NetMessageHead *pHandleNetData = (NetMessageHead*)szNetBuffer;
BYTE bMainID, bAssistantID, bHandleCode;
bMainID = pHandleNetData->bMainID;
bAssistantID = pHandleNetData->bAssistantID;
bHandleCode = pHandleNetData->bHandleCode;
//服务器的接收数据后的处理程序
pServer->m_pServerService->OnSocketReadEvent(pHandleNetData, uMessageSize?pHandleNetData+1:NULL, uMessageSize, *socketIter);
//在群发消息
pServer->SendDataToAll(uMessageSize?pHandleNetData+1:NULL, uMessageSize, bMainID, bAssistantID, bHandleCode);
} while (uBufLen > 0 && ((*socketIter)->GetSocket() != INVALID_SOCKET) );
}
else
{
socketIter++;
}
}
if(FD_ISSET(ListenSocket, &fdread))//连接服务器
{
cout << "进入监听套接字" << endl;
int tempSocket = accept(ListenSocket, NULL, NULL);
if(tempSocket != INVALID_SOCKET)
{
CSocket *newSocket = new CSocket(pClientService);
if( newSocket->SetSocket(tempSocket) )
{ pServer->m_socketList.push_back(newSocket);
}
cout << "客户端连接服务器成功" << endl;
}
}
LINUX_WIN_LOCk_MUTEXUNLOCK(&pServer->m_csLock);
} }
}