本帖最后由 VisualEleven 于 2012-02-08 22:09:26 编辑

解决方案 »

  1.   

    你接收部分的代码怎么写的?buf缓冲区定义多大?
      

  2.   


    在connect之前,我已经通过 setsockopt(m_hSocket,SOL_SOCKET,SO_RCVBUF,(const char*)&m_nRcvSize,sizeof(int));将缓冲区定义为2M了接收代码如下:
    while(TRUE)
    {
    FD_ZERO(&fdRead);
    FD_ZERO(&fdError);
    FD_SET(m_hSocket,&fdRead);
    FD_SET(m_hSocket,&fdError);
    nRet = select(0,&fdRead,NULL,&fdError,&timeout);
    if(FD_ISSET(m_hSocket,&fdRead))
    {
    nRecvRet = recv(m_hSocket,(char*)&pBuf[nRecvSize],nSize,0);
    strLog.Format(_T("TransClient:recv=%d"),nRecvRet);
    OutputDebugString(strLog);
    if(nRecvRet == -1)
    {
    strLog.Format(_T("TransClient:LastError=%d"),WSAGetLastError());
    OutputDebugString(strLog);
    }
    if(nRecvRet == 0 || nRecvRet == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK)
    {
    OutputDebugString(_T("TransClient:nRecvRet=SOCKET_ERROR"));
    _DestroySocket();
    return NETRET_ERROR;
    }
    nRecvSize += nRecvRet;
    if(GETPACKETLEN(pPacket->nDataSize) <= nRecvSize)//数据已经取完
    {
    bSuccess = TRUE;
    nSize = nRecvSize;
    break;
    }
    nSize = GETPACKETLEN(pPacket->nDataSize) - nRecvSize;
    }
    else if(FD_ISSET(m_hSocket,&fdError))
    {
    OutputDebugString(_T("TransClient:fdError"));
    _DestroySocket();
    return NETRET_ERROR;
    }
    else//接收超时
    {
    //nTimeout--;
    if(nRet == SOCKET_ERROR)
    {
    DWORD dwError;
    dwError = WSAGetLastError();
    break;
    }
    nRetryTimes--;
    if(nRetryTimes < 0)
    break;
    Sleep(500);
    }
    }
      

  3.   

    nRecvRet = recv(m_hSocket,(char*)&pBuf[nRecvSize],nSize,0);初始nSize可是pBuf的大小?
      

  4.   


    nSize=2M。
    如果将客户端和服务器在同一台机器上运行就没有问题(send和recv都是2M),但在两台机器上运行就出现recv很慢的情况了,如果是网络环境的原因,那上载也应该很慢呀,结果上载又很快,我就有点晕了。
    还请各位大哥帮小弟解答一下。
      

  5.   


    recv方初始nSize必须是pBuf的大小。与网络无关send方的大小是根据网络情况设置的
      

  6.   

    这个问题在我们自己的测试环境中没有出现,但在用户环境中出现了。并且这几天在程序中加了很多日志发现另一种情况,如果服务端都是按照2M的数据发给客户端的话,客户端很快就会自己断开(recv返回-1,getlasterror返回10053),但如果服务端每次只发2K的数据则客户端不会出现断开的情况。难道是服务端发的数据太大,把客户端给冲断了?
      

  7.   

    应该是linger 选项 没有设置够。
    发送端把2M数据发出去了,实际在在CACHE里,然后关闭SOCKET,如果linger不够长,就会导致,另一段接收数据不完整,出现连接断开的错误。
    所以,应该是发完数据,不要关闭socket,应该调用recv,等到一个确认数据接收完毕的确认包,就不会有这样的问题。
      

  8.   

    结帖了,见者有分。经过远程查看,最后确定不是程序问题,是因为他们装了XX公司的杀毒软件,他们把杀软关了就对了。
    我分析应该是这样的,当从服务器端下载数据的时候因为每个包都很大,并且频率也很高,所以杀软认为这是肉鸡在攻击,所以直接把socket给断了。
    大家以后一定要注意呀,这次费了这么多事,却是这个原因,太浪费时间了。并祝大家节日快乐,呵呵。