我要做的程序非常简单,客户端连到服务器,发送一个几十个字节的字符串过去,
服务器把其中的小写字母变成大写,然后发回来。问题是:收到的被发回来的数据只是原串的一部分,比如发过去:i like this game应该收到:I LIKE THIS GAME实际收到:I或者I LI在一个联接的前几次往复中还能收完整的字符串,反复个几次就不行了,最后往往只能收到1个字节的数据,请大家帮帮忙看看什么原因收发数据的主要代码如下:
while(1)
{
dwWaitRet = WSAWaitForMultipleEvents(pos, er, false,1000,true);
if (dwWaitRet == WSA_WAIT_TIMEOUT) continue;
if (dwWaitRet == WSA_WAIT_FAILED)
{
dwErr = WSAGetLastError();
while(pos-- > 0) ShutDownIt(pos);
return 0;
}

dwWaitRet = dwWaitRet - WSA_WAIT_EVENT_0; WSAResetEvent(er[dwWaitRet]); dwRet = WSAGetOverlappedResult(c[dwWaitRet], &or[dwWaitRet], &dwRecv, false, &dwFlag);//判断是否收好数据了
if (dwRet == TRUE)
{
if (dwRecv == 0) // dwRecv常常等于1,也就是只收到了1个字节
{
ShutDownIt(dwWaitRet); 
continue;
}
if (dwRecv < 1024) br[dwWaitRet].buf[dwRecv] = 0x0;
br[dwWaitRet].len = dwRecv;

SendMessage(pMain->GetSafeHwnd(), WMX_SHOW, dwWaitRet, (LPARAM)br[dwWaitRet].buf); FillSendBuf(dwWaitRet); //填充新的发送缓冲区
dwErr = WSASend(c[dwWaitRet], &bw[dwWaitRet], 1, &dwSent, dwFlag, &ow[dwWaitRet],NULL);  //发下一次数据
dwRet = WSARecv(c[dwWaitRet], &br[dwWaitRet], 1, &dwRecv, &dwFlag, &or[dwWaitRet], NULL); //投递下一次recv请求
if (dwErr == SOCKET_ERROR || dwRet == SOCKET_ERROR)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
ShutDownIt(dwWaitRet);
}
}
}else{
dwErr = WSAGetLastError();
ShutDownIt(dwWaitRet);
}
}

解决方案 »

  1.   

    dwErr = WSASend(c[dwWaitRet], &bw[dwWaitRet], 1, &dwSent, dwFlag, &ow[dwWaitRet],NULL);
    改成
    dwErr = WSASend(c[dwWaitRet], &bw[dwWaitRet], 1, &dwSent, dwFlag, NULL, NULL);
    试试。
      

  2.   

      找到问题并已解决,在投递下一次接收时没有把WSABUF.len重新设成1024,
    而是直接沿用了上一次的dwRecv值,结果就收不好,强制在投递前重设一次
    WSABUF.len的值就好了。但我还是不知道错误的原因,因为我用上一次收到的
    字节数来做下一次的长度,应该没什么问题吧,怎么会不够呢?