Beispiel #1
0
            private void ClientHandler <M>(Socket clientSocket)
            {
                clientList.Add(clientSocket);
                OnServerAccept?.Invoke(this, new AcceptEventArgs(clientSocket));
                int    fullMessageSize;
                string fullMessage;

                byte[] messageBuffer = new byte[1024];
                while (true)
                {
                    fullMessage     = string.Empty;
                    fullMessageSize = 0;
                    try
                    {
                        do
                        {
                            int messageSize = clientSocket.Receive(messageBuffer);
                            fullMessageSize += messageSize;
                            fullMessage     += Encoding.UTF8.GetString(messageBuffer, 0, messageSize);
                        } while (clientSocket.Available > 0);
                        OnServerReceive?.Invoke(this, new EventArgs());
                    }
                    catch (Exception exception)
                    {
                        OnReceiveException?.Invoke(this, new ExceptionEventArgs(clientSocket, exception));
                        break;
                    }

                    List <ByteArray> byteArrays = Buffer.SplitBuffer(Encoding.UTF8.GetBytes(fullMessage), 0);

                    object message = default;
                    foreach (var byteArray in byteArrays)
                    {
                        if (typeof(M) != typeof(string))
                        {
                            message = JsonSerializer.Deserialize <M>(Encoding.UTF8.GetString(byteArray.bytes));
                        }
                        else
                        {
                            message = Encoding.UTF8.GetString(byteArray.bytes);
                        }
                        MessageProcessing?.Invoke(this, new MessageProcessEventArgs(new MessageData(message, fullMessageSize, fullMessage)));
                    }
                }
            }
        private HandleResult ServerAccept(IServer sender, IntPtr connId, IntPtr client)
        {
            // 暂停接收数据
            if (!sender.PauseReceive(connId))
            {
                SetErrorInfo(sender);
                return(HandleResult.Error);
            }

            // 设置附加数据到 server & agent
            var extra = new TcpPortForwardingExtra
            {
                ServerConnId = connId,
                Server       = sender,
                Agent        = _agent,
                ReleaseType  = TcpPortForwardingReleaseType.None,
            };

            if (!sender.SetExtra(connId, extra))
            {
                return(HandleResult.Error);
            }

            if (!_agent.Connect(TargetAddress, TargetPort, connId, out var agentConnId))
            {
                SetErrorInfo(sender);
                return(HandleResult.Error);
            }

            extra.AgentConnId = agentConnId;
            if (!_agent.SetExtra(agentConnId, extra))
            {
                return(HandleResult.Error);
            }

            return(OnServerAccept?.Invoke(sender, connId, client) ?? HandleResult.Ok);
        }