下面是一段接收从客户机发送的消息的代码,当客户机发送的消息超过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消息的处理

解决方案 »

  1.   

    if (iBytesRead == SOCKET_ERROR)
    MessageBox("OnClientRead recv reported a socket error.  ");
    要改成:
    if (iBytesRead == SOCKET_ERROR)
             {
    MessageBox("OnClientRead recv reported a socket error.  ");
                      return GetLastError();
             }
      

  2.   

    recv可不保证一次就读完了.要是一次没有recv完,再recv
      

  3.   

    char chIncomingDataBuffer[1024];
    你接收的缓冲只有1024啊,所有你需要一个大的缓冲来存储数据
      

  4.   

    1.缓冲区定义长度小了,可以扩大
    2.应该判断recv是否收完你发的数据包,如果没有收完应该再收,最好作个循环收,直到收完为止
    3。即使真的接受错误,也不是一定要退出,有可能是wsawouldblock错误,这个错误只是阻塞错,继续接受数据就可以。