本帖最后由 VisualEleven 于 2012-01-12 13:29:25 编辑

解决方案 »

  1.   


    客户端发送给服务端的心跳包还是都可以正常接收到的;只有服务端发给客户端的数据收不到了,服务端发送时一直返回错误WSAEWOULDBLOCK;
      

  2.   

    只能说明程序有问题,增大缓冲区只能缓解
    就像假如程序有内存泄漏,把系统虚拟内存从1G改成10G,系统崩溃的确变慢了,但是到了10G的时候还是得歇火,无助于解决问题
      

  3.   

    我现在流程是这样:
    服务端播放线程将数据,PostMessage给主线程,主线程用得到的数据打包,计算数据效验值TRACE显示,通过CAsyncSocket发送;
    客户端主线程收到数据,PostMessage给处理线程,处理线程解包,也计算数据的效验值TRACE显示,播放;TRACE看到效验值,每次发送的和接收的都是相邻的并且相同的值,只是某个时候的一份数据发送成功,却接收不到了,后面就是WSAEWOULDBLOCK;缓冲区大小的情况,我也大概觉得是把缓冲区弄的有点问题,具体就不明白怎么回事了。
      

  4.   

    我找来找去,觉得可能是SOCKET的缓冲区有问题,可能是我太频繁的发送还是怎样;能不能帮我找一些关于SOCKET调试的方法,比如怎么判断是哪个缓冲区有问题;我网络方面不熟悉,一直查不到合适的资料。
      

  5.   

    在发送和接收的相关位置打印一些调试信息出来
    通过这些信息观察和分析
    具体的要看你的程序实现了
    打印信息trace就可以
      

  6.   

    在发送和接收的相关位置打印一些调试信息出来
    通过这些信息观察和分析
    具体的要看你的程序实现了
    打印信息trace就可以
      

  7.   

    我有做TRACE,每次发送成功时,我将所有发送出去的数据做这样一个效验值
    m_nCheckLastSend = 0;
    for (int i = nWriteDataCount - 1; i >= 0; --i)
    m_nCheckLastSend += *(pWriteData + i);同样每次接收成功也做这样的效验
    m_nCheckLastReceive = 0;
    for (int i = nReadDataCount - 1; i >= 0; --i)
    m_nCheckLastReceive += *(pReadData + i);每次发送成功时,TRACE显示发送的效验值m_nCheckLastSend;接收成功时,也TRACE显示接收到的效验值m_nCheckLastReceive,输出看到每次发送和接收都是相邻的,并且两个效验值也相等,比如这样:
    Last Send check is 2413628.
    2413628 is the Last Receive check.
    Last Send check is 2314141.
    2314141 is the Last Receive check.看来除了心跳检测,自动重连外,我没别的办法了……
      

  8.   

    发的代码缩进都没得了……
    // 发送成功时:
    m_nCheckLastSend = 0;
    for (int i = nWriteDataCount - 1; i >= 0; --i)
        m_nCheckLastSend += *(pWriteData + i);// 接收成功时:
    m_nCheckLastReceive = 0;
    for (int i = nReadDataCount - 1; i >= 0; --i)
        m_nCheckLastReceive += *(pReadData + i);// 控制台打印信息
    Last Send check is 2497820.
    2497820 is the Last Receive check.

    Last Send check is 2503796.
    2503796 is the Last Receive check.