本帖最后由 VisualEleven 于 2011-10-09 16:08:06 编辑

解决方案 »

  1.   

    传递的s Socket对象是否有问题
      

  2.   

    不像是这个参数的问题啊,因为debug版本没有问题。
    觉得是可能内存分配的问题, 求高手解答啊!!
      

  3.   

    10004: 一个封锁操作被对 WSACancelBlockingCall 的调用中断。 
      

  4.   

    我的理解,可能有不对的地方,但希望对你有所帮助1. 通过Error Lookup查看 10004:
       A blocking operation was interrupted by a call to WSACancelBlockingCall.
      函数调用中断。该错误表明由于对WSACancelBlockingCall的调用,造成了一次调用被强行中断。2. socket数据缓冲区的大小有限,所以很多时候一次recv调用并不将我们需要的数据接收完成,所
       以需要多次调用,但这时候需要注意的问题,你的BUFFER的地址变化,以及BUFFER大小的变化
    /*
     * 循环接收数据
     * SOCKET s         [in]: socket
     * char* pszBuf [in/out]: 接收数据的BUFF
     * int iLen         [in]: BUFF的长度
     */
    BOOL Receive(SOCKET s, char* pszBuf, int iLen)
    {
        int iByte = 0;
        int iByteSum = 0;    while(iByte > 0)
        {
            iByte = recv(s, pszBuff+iByteSum, iLen, 0);
            if(SOCKET_ERROR == iByte)
            {
                printf("err no: %d\n", WSAGetLastError());
                return FALSE;
            }        iByteSum = iByteSum+iByte;
            iLen = iLen-iByte;
        }
        return TRUE;
    }  
      

  5.   

    猜测:线程相关。CString构造和析构耽误了时间,导致行为不同。而int仅仅改变ebp,不增加cpu周期。
    写个Sleep(0)替代CString试试看。
      

  6.   

    我的也出现LZ这个问题,很奇怪,加了Sleep(1)后,第1次连接出现这个问题,但后面就没有了。
    猜想原因可能是连接方是多个线程同时连接服务器方造成(我的实例工程中连接计算程序是两个线程独立连接服务端相同的端口,进行独立的数据请求操作)