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); } }
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); } }