下面是一段接收从客户机发送的消息的代码,当客户机发送的消息超过1024之后,就老是出现接收的与发送的不一样的错误,恳请大家指点迷津。
接收消息的代码如下:
LRESULT CServerView::OnClientRead(WPARAM wParam, LPARAM lParam)
{
int iBytesRead;
int iBufferLength;
int iEnd;
int iSpaceRemaining;
char chIncomingDataBuffer[1024];
int i;
for(i=0;(i<MAXClient)&&(m_aClientSocket[i]!=wParam);i++)
{
}
if(i==MAXClient) return 0L;
iBufferLength = iSpaceRemaining = sizeof(chIncomingDataBuffer);
iEnd = 0;
iSpaceRemaining -= iEnd;
iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chIncomingDataBuffer+iEnd), iSpaceRemaining, 0);
iEnd+=iBytesRead;
if (iBytesRead == SOCKET_ERROR)
MessageBox("OnClientRead recv reported a socket error. ");
chIncomingDataBuffer[iEnd] = '\0';
if (lstrlen(chIncomingDataBuffer) != 0)
{
PrintString(chIncomingDataBuffer);
MessageBox(chIncomingDataBuffer,"收到",MB_OK);
OnServerBroadcast(chIncomingDataBuffer);
}
else
;
return(0L);
}
注:m_aClientSocket[]是一个SOCKET类型的数组,iBufferLength好像没有用上,是个多余的变量。
还有啊,本函数是自定义的对FD_READ消息的处理
接收消息的代码如下:
LRESULT CServerView::OnClientRead(WPARAM wParam, LPARAM lParam)
{
int iBytesRead;
int iBufferLength;
int iEnd;
int iSpaceRemaining;
char chIncomingDataBuffer[1024];
int i;
for(i=0;(i<MAXClient)&&(m_aClientSocket[i]!=wParam);i++)
{
}
if(i==MAXClient) return 0L;
iBufferLength = iSpaceRemaining = sizeof(chIncomingDataBuffer);
iEnd = 0;
iSpaceRemaining -= iEnd;
iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chIncomingDataBuffer+iEnd), iSpaceRemaining, 0);
iEnd+=iBytesRead;
if (iBytesRead == SOCKET_ERROR)
MessageBox("OnClientRead recv reported a socket error. ");
chIncomingDataBuffer[iEnd] = '\0';
if (lstrlen(chIncomingDataBuffer) != 0)
{
PrintString(chIncomingDataBuffer);
MessageBox(chIncomingDataBuffer,"收到",MB_OK);
OnServerBroadcast(chIncomingDataBuffer);
}
else
;
return(0L);
}
注:m_aClientSocket[]是一个SOCKET类型的数组,iBufferLength好像没有用上,是个多余的变量。
还有啊,本函数是自定义的对FD_READ消息的处理
MessageBox("OnClientRead recv reported a socket error. ");
要改成:
if (iBytesRead == SOCKET_ERROR)
{
MessageBox("OnClientRead recv reported a socket error. ");
return GetLastError();
}
你接收的缓冲只有1024啊,所有你需要一个大的缓冲来存储数据
2.应该判断recv是否收完你发的数据包,如果没有收完应该再收,最好作个循环收,直到收完为止
3。即使真的接受错误,也不是一定要退出,有可能是wsawouldblock错误,这个错误只是阻塞错,继续接受数据就可以。