Esempio n. 1
0
        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;
            }
        }
Esempio n. 2
0
 internal MessageArriveArgs(TcpServerUserSession session, short id, byte[] arr, int offset, int length) {
     Session = session;
     MessageID = id;
     Content = new ArraySegment<byte>(arr, offset, length);
 }
Esempio n. 3
0
        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);
        }