예제 #1
0
        /// <summary>
        /// 开始接收网络数据
        /// </summary>
        /// <param name="skt"></param>
        /// <param name="closeCB"></param>
        public void StartRcvData(Socket skt, Action closeCB)
        {
            try
            {
                this.skt     = skt;
                this.closeCB = closeCB;

                //连接成功的回调
                OnConnected();

                NetPkg pack = new NetPkg();
                //开始异步接收数据
                skt.BeginReceive(
                    pack.headBuff,
                    0,
                    pack.headLen,
                    SocketFlags.None,
                    new AsyncCallback(RcvHeadData),
                    pack);

                Console.WriteLine("接收数据:" + skt.ToString());
            }
            catch (Exception e)
            {
                NetLogger.LogMsg("开始接收数据错误:" + e.Message, LogLevel.Error);
            }
        }
예제 #2
0
        /// <summary>
        /// 接收包体数据
        /// </summary>
        /// <param name="ar"></param>
        private void RcvBodyData(IAsyncResult ar)
        {
            try
            {
                NetPkg pack = (NetPkg)ar.AsyncState;
                int    len  = skt.EndReceive(ar);
                if (len > 0)
                {
                    pack.bodyIndex += len;
                    if (pack.bodyIndex < pack.bodyLen)
                    {
                        skt.BeginReceive(pack.bodyBuff,
                                         pack.bodyIndex,
                                         pack.headLen - pack.bodyIndex,
                                         SocketFlags.None,
                                         new AsyncCallback(RcvBodyData),
                                         pack
                                         );
                    }
                    else
                    {
                        T msg = AnalysisMsg.DeSerialize <T>(pack.bodyBuff);
                        OnReciveMsg(msg);

                        //循环接收
                        pack.ResetData();
                        skt.BeginReceive(
                            pack.headBuff,
                            0,
                            pack.headLen,
                            SocketFlags.None,
                            new AsyncCallback(RcvHeadData),
                            pack);
                    }
                }
                else
                {
                    OnDisConnected();
                    Clear();
                }
            }
            catch (Exception e)
            {
                NetLogger.LogMsg("接收包体数据错误:" + e.Message, LogLevel.Error);
            }
        }
예제 #3
0
        /// <summary>
        /// 接收包头数据
        /// </summary>
        /// <param name="ar"></param>
        private void RcvHeadData(IAsyncResult ar)
        {
            try
            {
                //避免断开连接时,异步回调调用EndReceive会报错

                /*if (skt==null)
                 * {
                 *  NetLogger.LogMsg("当前对应客户端不存在,直接返回");
                 *  return;
                 * }*/

                if (skt == null)
                {
                    return;
                }


                NetPkg pack = (NetPkg)ar.AsyncState;
                if (skt.Available == 0)
                {
                    OnDisConnected();
                    Clear();
                    return;
                }
                NetLogger.LogMsg("开始结束异步读取");
                int len = skt.EndReceive(ar);
                if (len > 0)
                {
                    pack.headIndex += len;
                    //如果是小于4的就是凑不成一个包头,就是要分包继续接收
                    if (pack.headIndex < pack.headLen)
                    {
                        //接收数据
                        skt.BeginReceive(
                            pack.headBuff,
                            pack.headIndex,
                            pack.headLen - pack.headIndex,
                            SocketFlags.None,
                            new AsyncCallback(RcvHeadData),
                            pack);
                    }
                    else
                    {
                        //设置byte[]的长度
                        pack.InitBodyBuff();
                        skt.BeginReceive(pack.bodyBuff,
                                         0,
                                         pack.bodyLen,
                                         SocketFlags.None,
                                         new AsyncCallback(RcvBodyData),
                                         pack);
                    }
                }
                else
                {
                    OnDisConnected();
                    Clear();
                }
            }
            catch (Exception e)
            {
                NetLogger.LogMsg("接收包头数据错误:" + e.Message, LogLevel.Error);
            }
        }