Beispiel #1
0
 private void RcvHeadData(IAsyncResult ar)
 {
     try {
         PEPkg pack = (PEPkg)ar.AsyncState;
         //返回的len为该次接受数据的总长度
         int len = skt.EndReceive(ar);
         if (len > 0)
         {
             //headIndex此时为数据的包括数据头和数据身体的总长度
             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
             {
                 //初始化数据身体,并且再次开始接受,这次接受的目的是按照数据头指定的长度接受数据身体
                 pack.InitBodyBuff();
                 skt.BeginReceive(pack.bodyBuff,
                                  0,
                                  pack.bodyLen,
                                  SocketFlags.None,
                                  new AsyncCallback(RcvBodyData),
                                  pack);
             }
         }
         //当len<=0的情况,即远程主机强制关闭了一个现有的连接,这时候服务器会疯狂接收到空数据,这时候就应该关闭掉这段Socket连接
         else
         {
             //发送关闭连接的信息
             OnDisConnected();
             //关闭连接
             Clear();
         }
     }
     catch (Exception e)
     {
         PETool.LogMsg("RcvHeadError:" + e.Message, LogLevel.Error);
     }
 }
Beispiel #2
0
 private void RcvHeadData(IAsyncResult ar)
 {
     try {
         PEPkg pack = (PEPkg)ar.AsyncState;
         if (skt.Available == 0)
         {
             OnDisConnected();
             Clear();
             return;
         }
         int len = skt.EndReceive(ar);
         if (len > 0)
         {
             pack.headIndex += len;
             if (pack.headIndex < pack.headLen)
             {
                 skt.BeginReceive(
                     pack.headBuff,
                     pack.headIndex,
                     pack.headLen - pack.headIndex,
                     SocketFlags.None,
                     new AsyncCallback(RcvHeadData),
                     pack);
             }
             else
             {
                 pack.InitBodyBuff();
                 skt.BeginReceive(pack.bodyBuff,
                                  0,
                                  pack.bodyLen,
                                  SocketFlags.None,
                                  new AsyncCallback(RcvBodyData),
                                  pack);
             }
         }
         else
         {
             OnDisConnected();
             Clear();
         }
     }
     catch (Exception e) {
         PETool.LogMsg("RcvHeadError:" + e.Message, LogLevel.Error);
     }
 }