基于TCP异步SOCKET服务端与客户端程序:服务端循环分包发送每次包大小为 4906 字节客户端异步BEGINRECEIVE接收const int BagSize = 8192        private void receiveCallBack(IAsyncResult ar)
        {
            Socket MySocket = (Socket)ar.AsyncState;
            
            int receLen = 0;
            try
            {
              //** 此处每次接收的字节应该是分包发送的字节(4096),但是除第一次接收为4096外(10%为8192),接收其他分包都为8192
                receLen = MySocket.EndReceive(ar);
            }            catch (Exception err)
            {
                return;
            }            if (receLen > 0)
            {                byte[] currentBin = new byte[receLen];
                Buffer.BlockCopy(data, 0, currentBin, 0, receLen);
                MyList.ReceivedCallBack(currentBin, MySocket, ar); //此处逻辑处理收到数据
                
                try
                {
                    ReceiveData();
                }
                catch (SocketException)
                {
                    MySocket.Close();
                }            }            else
            {
 
            }        }例如服务端发送10K的字节,那么是分为三个包发送的,第一个4906字节,第二个4906字节,第三个428字节,每次循环分包发送均不延时。问:客户端在接收的时候,怎么解决粘包的问题。

解决方案 »

  1.   

    http://www.cnblogs.com/wzd24/archive/2007/12/24/1011932.html
      

  2.   

    你管他粘不粘包,你只管,你要收到的数据,收完了没有你可以在最后的地方设置一个标识,当10K读完的时候,最后读到那个标识 ,你就知道你要的数据已经读取完成了,反正方法很多,你不要底层是不是粘包了,或是延迟了,反正你没有读到这个标志,你就一直读,因为TCP他会保证,先送的包,一定会先达到(换个说话,也就是你发送的顺序和你接收的顺序是肯定是一致的,而且不会丢包,因为丢包,服务端肯定会自己重发,以保证绝不丢失一个包)
      

  3.   

    http://download.csdn.net/down/335689/tsky0722
      

  4.   


    应用ANALYER类,读取输出中,READINT异常,COUNT值为-16777210
      

  5.   

    粘包也算是个问题?
    楼主请看清linux7985的答复,一点都没错。
    理论上讲,tcp保证了数据包不会丢,不会乱。tcp的优化算法也会造成所谓的粘包(把你的小包(如果也叫包)放到一个大的tcp包里)。你只要把接收到的数据按顺序放到一个缓冲区里,再按照你的数据的定义,定长的也好,有结构的也好,按照你的定义去处理就好了,不符合定义的就说明没接收完,继续接收。
      

  6.   

    搞定,感谢 Linux7985 和 soaringbird