public bool SendAsync(byte[] bytes) { SendBuffer.StartPacket(); // 写入包头 SendBuffer.Buffer.WriteInt16(Packet.HEAD); // 写入包长 SendBuffer.Buffer.WriteInt32(bytes.Length); // 写入数据 SendBuffer.Buffer.WriteBytes(bytes, 0, bytes.Length); SendBuffer.EndPacket(); bool result = true; if (!mSendAsync) { int count = 0; int offset = 0; if (SendBuffer.GetFirstPacket(ref offset, ref count)) { mSendAsync = true; SendEventArgs.SetBuffer(SendBuffer.Buffer.Bytes, offset, count); result = AsyncNet.SendAsync(this); } } return(result); }
public void add(AsyncNet net) { lock (queue) { queue.Add(net); Monitor.Pulse(queue); } }
public bool RecvAsync() { // 写入数据内容 int lastPos = RecvBuffer.Position; RecvBuffer.WriteBytes(RecvEventArgs.Buffer, RecvEventArgs.Offset, RecvEventArgs.BytesTransferred); RecvBuffer.Clear(RecvBuffer.Position - lastPos); // Position位置回退 BytesTransferred = BytesTransferred + RecvEventArgs.BytesTransferred; bool result = true; while (BytesTransferred >= sizeof(short)) { // 包头检查 short head = RecvBuffer.ReadInt16(); if (head != Packet.HEAD) { App.Logger.Error("包头错误, 关闭远程连接!"); return(false); } BytesTransferred = BytesTransferred - sizeof(short); // 包长 int length = RecvBuffer.ReadInt32(); if ((length > 1024 * 1024) | (RecvBuffer.Position > BufferSize)) { // 最大缓存保护 App.Logger.Error("字节流溢出,即将关闭远程连接!"); return(false); } BytesTransferred = BytesTransferred - sizeof(int); lastPos = RecvBuffer.Position; Packet.Serialization(RecvBuffer, false); RecvBuffer.Clear(RecvBuffer.Position - lastPos); Packet oPacket = PacketFactory.CreatePacket(Packet.PacketID); if (oPacket != null) { lastPos = RecvBuffer.Position; oPacket.Serialization(RecvBuffer, false); int oDataLength = RecvBuffer.Position - lastPos; BytesTransferred = BytesTransferred - oDataLength; // 接收包 oPacket.state = this; AsyncNet.Recive(oPacket); } else { App.Logger.Error("协议解析出错, 即将关闭远程连接"); return(false); } } return(result); }
public bool SendAsyncCompleted() { ActiveDateTime = DateTime.UtcNow; mSendAsync = false; SendBuffer.ClearFirstPacket(); //清除已发送的包 int offset = 0; int count = 0; if (SendBuffer.GetFirstPacket(ref offset, ref count)) { mSendAsync = true; // 设置发送的数据包 SendEventArgs.SetBuffer(SendBuffer.Buffer.Bytes, offset, count); return(AsyncNet.SendAsync(this)); } else { return(true); } }
public void add(AsyncNet net) { lock(worker.queue) { worker.queue.Add(net); Monitor.Pulse(worker.queue); } }
public void add(AsyncNet net) { lock(queue) { queue.Add(net); Monitor.Pulse(queue); } }