private void TryDequeueAndPostSend(TcpConnect tcpConn) { byte[] data; if (tcpConn.TryDequeue(out data)) { AsyncUserToken dataToken = (AsyncUserToken)tcpConn.SendEventArgs.UserToken; dataToken.messageBytes = data; dataToken.messageLength = data.Length; if (TestLag) { dataToken.SendTime = System.DateTime.Now.Ticks; // IDllImportAPI.HighPrecision_GetTickCount(); } try { PostSend(tcpConn.SendEventArgs); } catch (System.Exception ex) { Log.Log.Net.Info(ex.ToString()); Log.Log.Net.Info(ex.StackTrace.ToString()); //发送发生了异常,那么这个连接都关闭算了。 HandleCloseSocket(tcpConn.ReceiveEventArgs); } } else { tcpConn.ResetSendFlag(); } }
/// <summary> /// Posts the send. /// </summary> public void PostSend(TcpConnect tcpConn, byte[] data, int offset, int count) { int P = NetPacketParser.PREFIX_SIZE; byte[] buffer = new byte[count + P]; Buffer.BlockCopy(BitConverter.GetBytes((UInt16)count), 0, buffer, 0, P); Buffer.BlockCopy(data, offset, buffer, P, count); tcpConn.Enqueue(buffer); if (tcpConn.TrySetSendFlag()) { try { AsyncUserToken dataToken = (AsyncUserToken)tcpConn.SendEventArgs.UserToken; dataToken.Reset(true); TryDequeueAndPostSend(tcpConn); } catch { tcpConn.ResetSendFlag(); throw; } } }