private bool ProcessData(TcpServerUserSession session, byte[] receivedData, int offset, int length) { try { // 首先读取头部信息,以确定所传输的数据特征 var flags = (MessageFlags)(System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(receivedData, offset))); var isReply = (flags & MessageFlags.Response) == MessageFlags.Response; // 获取消息号 var messageID = System.Net.IPAddress.NetworkToHostOrder(BitConverter.ToInt16(receivedData, offset + sizeof(short))); // 进行处理,将数据拷贝以防止缓冲区覆盖 var buffer = new byte[length - sizeof(short) * 2]; Array.Copy(receivedData, offset + sizeof(short) * 2, buffer, 0, buffer.Length); if (session.IsEncrypted) { // 对于已经加密的内容,要进行解密 session.initEncryption(); buffer = session.aes.CreateDecryptor().TransformFinalBlock(buffer, 0, buffer.Length); } if (!isReply) { var args = new MessageArriveArgs(session, messageID, buffer, 0, buffer.Length); if ((flags & MessageFlags.InternalCalls) == MessageFlags.InternalCalls) { // 如果是内部指令,可以直接在内部处理 if (buffer[0] == (byte)InternalCalls.RequestRSAPublicKey) { // 发送 RSA 公钥 session.SendAndForget(Encoding.UTF8.GetBytes(rsa.ToXmlString(false)), args); } else if (buffer[0] == (byte)InternalCalls.SendAESKeysViaRSA) { if (rsa == null) { session.SendAndForget(new byte[] { 1 }, args); } else { // 解析 AES Key 和 IV,然后开始加密对话 var aesKeyAndIV = rsa.Decrypt(buffer.Skip(1).ToArray(), true); session.AesKey = aesKeyAndIV.Take(16).ToArray(); session.AesIV = aesKeyAndIV.Skip(16).Take(16).ToArray(); session.SendAndForget(new byte[] { 0 }, args); session.IsEncrypted = true; } } } else { ThreadPool.QueueUserWorkItem(o => { maxCountOfConcurrentDataProccesserLimiter.WaitOne(); try { if (this.MessageArrive != null) { MessageArrive(this, args); } } catch { session.Dispose(); } finally { maxCountOfConcurrentDataProccesserLimiter.Release(); } }); } return true; } else { // 对于回复,首先判断是否有等待的句柄 if (session.waitHandles[messageID] == null) return true; // 设置参数 session.replyArrays[messageID] = new ArraySegment<byte>(buffer, 0, buffer.Length); // 如果有等待句柄,则通知事件 lock (session.waitHandles[messageID]) Monitor.Pulse(session.waitHandles[messageID]); return true; } } catch { return false; } }
internal MessageArriveArgs(TcpServerUserSession session, short id, byte[] arr, int offset, int length) { Session = session; MessageID = id; Content = new ArraySegment<byte>(arr, offset, length); }
private void ProcessAccept(SocketAsyncEventArgs acceptEventArgs) { if (acceptEventArgs.SocketError != SocketError.Success) { CloseConnection(acceptEventArgs); listenForConnectionAsync(acceptEventArgs); return; } // 继续监听下一个连接请求 var accessSocket = acceptEventArgs.AcceptSocket; acceptEventArgs.AcceptSocket = null; listenForConnectionAsync(acceptEventArgs); // 增加客户端数量 changeClientCount(1); // 为客户端创建一个 Session var session = new TcpServerUserSession(this, accessSocket, accessSocket.RemoteEndPoint); session.receiveArgs.Completed += ReceiveComplete_Callback; // 将 Session 放入客户端列表 lock (sessions) sessions.Add(session); // 开始接收客户端数据 BeginReceive(session.receiveArgs); }