本帖最后由 VisualEleven 于 2011-04-14 08:55:55 编辑

解决方案 »

  1.   

    TCP的发送和接收不是一一对应的,一次发送的数据可能需要多次接受才能收齐,多次发送的数据也可能一次收到。如果你想每次接收28字节数据,可以指定接收缓冲长度为28,这样就不会接收下一次发送的数据。另外还要根据函数的返回值来判断数据是否收全,如果只接收到一部分数据,要自己调整接收缓冲的指针和大小,继续接受后面的数据,直到收全位置。
      

  2.   

    同意ls大牛的,send和recv不是一一对应,send一次就recv一次,有可能send多次,然后recv一次就全部接收完成
      

  3.   

    涉及到粘包问题,使用多次发送和多次接收://发送数据
    int SendHunk(SOCKET h,char *lpBuf,int nBufLen)
    {
        int nSend = -1 ;
        int nSendAll = 0;
        
        if( h != SOCKET_ERROR && lpBuf != NULL && nBufLen > 0  )
        {
            //循环发送,直到所有数据都发送完毕或出错就返回
            do {  
                
                nSend = ::send(h,                //已经连接的句柄
                                lpBuf+nSendAll,   //跳过已经发送的数据
                                nBufLen-nSendAll, //计算剩余要发送的数据长度
                                0);
                
                if( nSend > 0 )
                    nSendAll +=nSend;//累加已经成功发送的数据长度
                else
                    break;
                
            } while( nSendAll < nBufLen );
        }
        
        return nSendAll;
    }//接收数据
    int  RecvHunk(SOCKET h,char *lpBuf,int nBufLen,int nWillLen)
    {
        int nRecv = -1 ;
        int nRecvAll = 0;    if( h != SOCKET_ERROR && lpBuf != NULL && nBufLen > 0  && nWillLen >0 && nBufLen >= nWillLen  )
        {
            //循环接收,直到数据达到要接收的长度或出错就返回
            do {            nRecv = ::recv(h, //已经连接的句柄
                                lpBuf+nRecvAll,//跳过已经接收的数据
                                nWillLen-nRecvAll,//计算剩余要接收的数据长度
                                0);
                if( nRecv >0 )
                    nRecvAll = nRecv;//当前已经接收的长度
                else
                    break;
                    
            } while( nRecvAll < nWillLen );
        }    return nRecvAll;
    }
      

  4.   

    把2ms的sleep去掉,对发送端和接收端的函数返回值做判断,对出错的时候进行处理
      

  5.   

    关于收发数据,还有个怪异的问题:我的电脑(比较老)测试不加Sleep可以正常收发,而新的电脑则一定要加sleep才能够处理,难道是因为处理太快的缘故?
      

  6.   

    粘包情况,tcp/ip这样处理主要是为了提高网络利用效率
      

  7.   

    TCP的数据相当于是一个流,我读取了一部分,整个数据就往前走,新的数据进来填充,是这个意思吗?