Beispiel #1
0
        private static void ValidateReceive(TcpServerConnection <int> serverData, int expectedValue)
        {
            int val;

            serverData.TryReceive(out val).Should().BeTrue();
            expectedValue.Should().Be(val);
        }
        /// <summary>
        /// Accepts the new TCP connections until cancelled.
        /// </summary>
        private async Task AcceptLoopAsync()
        {
            while (true)
            {
                TcpClient client;

                try
                {
                    client = await Listener.AcceptTcpClientAsync();
                }
                catch
                {
                    if (!CancellationTokenSource.IsCancellationRequested)
                    {
                        await Session.RemoveTunnelAsync(this);
                    }

                    break;
                }

                var connection = new TcpServerConnection(Id, Session, client);

                try
                {
                    await Session.AddConnection(connection, CancellationTokenSource.Token);

                    await connection.StartAsync();
                }
                catch
                {
                    System.Diagnostics.Debug.WriteLine("Failed to add connection for new TCP client.");
                }
            }
        }
        /// <summary>
        ///     Handle upgrade to websocket
        /// </summary>
        private async Task handleWebSocketUpgrade(SessionEventArgs args,
                                                  HttpClientStream clientStream, TcpServerConnection serverConnection,
                                                  CancellationTokenSource cancellationTokenSource, CancellationToken cancellationToken)
        {
            await serverConnection.Stream.WriteRequestAsync(args.HttpClient.Request, cancellationToken);

            var httpStatus = await serverConnection.Stream.ReadResponseStatus(cancellationToken);

            var response = args.HttpClient.Response;

            response.HttpVersion       = httpStatus.Version;
            response.StatusCode        = httpStatus.StatusCode;
            response.StatusDescription = httpStatus.Description;

            await HeaderParser.ReadHeaders(serverConnection.Stream, response.Headers,
                                           cancellationToken);

            if (!args.IsTransparent)
            {
                await clientStream.WriteResponseAsync(response, cancellationToken);
            }

            // If user requested call back then do it
            if (!args.HttpClient.Response.Locked)
            {
                await onBeforeResponse(args);
            }

            await TcpHelper.SendRaw(clientStream, serverConnection.Stream, BufferPool,
                                    args.OnDataSent, args.OnDataReceived, cancellationTokenSource, ExceptionFunc);
        }
        private void OnConnect(TcpServerConnection connection)
        {
            string ipAndPort = GetAlias(connection);

            serverWindow.PrintLine("<" + ipAndPort + "> connected.");
            TrySendMessage(connection, "OK|HELLO");
        }
Beispiel #5
0
        private int SendRandomData(TcpServerConnection <int> data)
        {
            var itemToBeSent = _random.Next(0, 1000);

            data.Send(itemToBeSent);
            return(itemToBeSent);
        }
        private async Task <RetryResult> handleHttpSessionRequest(string httpCmd, SessionEventArgs args,
                                                                  TcpServerConnection serverConnection, SslApplicationProtocol sslApplicationProtocol,
                                                                  CancellationToken cancellationToken, CancellationTokenSource cancellationTokenSource)
        {
            //a connection generator task with captured parameters via closure.
            Func <Task <TcpServerConnection> > generator = () =>
                                                           tcpConnectionFactory.GetServerConnection(this, args, isConnect: false,
                                                                                                    applicationProtocol: sslApplicationProtocol,
                                                                                                    noCache: false, cancellationToken: cancellationToken);

            //for connection pool, retry fails until cache is exhausted.
            return(await retryPolicy <ServerConnectionException>().ExecuteAsync(async(connection) =>
            {
                args.TimeLine["Connection Ready"] = DateTime.Now;

                if (args.HttpClient.Request.UpgradeToWebSocket)
                {
                    // if upgrading to websocket then relay the request without reading the contents
                    await handleWebSocketUpgrade(httpCmd, args, args.HttpClient.Request,
                                                 args.HttpClient.Response, args.ProxyClient.ClientStream, args.ProxyClient.ClientStreamWriter,
                                                 connection, cancellationTokenSource, cancellationToken);
                    return false;
                }

                // construct the web request that we are going to issue on behalf of the client.
                await handleHttpSessionRequest(connection, args);
                return true;
            }, generator, serverConnection));
        }
        /// <summary>
        ///     Handle upgrade to websocket
        /// </summary>
        private async Task handleWebSocketUpgrade(string httpCmd,
                                                  SessionEventArgs args, Request request, Response response,
                                                  CustomBufferedStream clientStream, HttpResponseWriter clientStreamWriter,
                                                  TcpServerConnection serverConnection,
                                                  CancellationTokenSource cancellationTokenSource, CancellationToken cancellationToken)
        {
            // prepare the prefix content
            await serverConnection.StreamWriter.WriteLineAsync(httpCmd, cancellationToken);

            await serverConnection.StreamWriter.WriteHeadersAsync(request.Headers,
                                                                  cancellationToken : cancellationToken);

            string httpStatus;

            try
            {
                httpStatus = await serverConnection.Stream.ReadLineAsync(cancellationToken);

                if (httpStatus == null)
                {
                    throw new ServerConnectionException("Server connection was closed.");
                }
            }
            catch (Exception e) when(!(e is ServerConnectionException))
            {
                throw new ServerConnectionException("Server connection was closed.", e);
            }

            Version responseVersion;
            int     responseStatusCode;
            string  responseStatusDescription;

            Response.ParseResponseLine(httpStatus, out responseVersion,
                                       out responseStatusCode,
                                       out responseStatusDescription);
            response.HttpVersion       = responseVersion;
            response.StatusCode        = responseStatusCode;
            response.StatusDescription = responseStatusDescription;

            await HeaderParser.ReadHeaders(serverConnection.Stream, response.Headers,
                                           cancellationToken);

            if (!args.IsTransparent)
            {
                await clientStreamWriter.WriteResponseAsync(response,
                                                            cancellationToken : cancellationToken);
            }

            // If user requested call back then do it
            if (!args.WebSession.Response.Locked)
            {
                await invokeBeforeResponse(args);
            }

            await TcpHelper.SendRaw(clientStream, serverConnection.Stream, BufferPool, BufferSize,
                                    (buffer, offset, count) => { args.OnDataSent(buffer, offset, count); },
                                    (buffer, offset, count) => { args.OnDataReceived(buffer, offset, count); },
                                    cancellationTokenSource, ExceptionFunc);
        }
 private string GetAlias(TcpServerConnection connection)
 {
     if (aliases.ContainsKey(connection))
     {
         return(aliases[connection]);
     }
     return((connection.Socket.Client.RemoteEndPoint as IPEndPoint)?.ToString() ?? "<unknown>");
 }
Beispiel #9
0
        void OnDataAvailable(TcpServerConnection connection)
        {
            NetworkStream stream = connection.Socket.GetStream();
            ClientRequest req    = ClientRequest.ReceiveFrom(stream);

            ServerResponse resp = ProcessRequest(req);

            resp.SendTo(stream);
        }
        //before retry clear connection
        private async Task disposeConnection()
        {
            if (currentConnection != null)
            {
                //close connection on error
                await tcpConnectionFactory.Release(currentConnection, true);

                currentConnection = null;
            }
        }
        //public event EventHandler<DataInfo> OnNewClient;
        //Dictionary<int, CommandAction> m_action;
        #endregion

        /**
         * constructor
         */
        public ImageServer(IImageController m, ILoggingService m_logging1, int port)
        {
            this.m_controller = m;
            this.m_logging    = m_logging1;
            this.port         = 8001;
            this.tcpServer    = new TcpServerConnection(this.m_controller, m_logging);
            this.tcpServer.Sh.CommandRecieved += sendCmd;
            // this.OnNewClient += this.tcpServer.onNewClient;
            handlers = new List <IDirectoryHandler>();
        }
Beispiel #12
0
        private void Connection2_OnConnect(TcpServerConnection connection)
        {
            client_count++;
            NotifierHelper.Notify("Connection.ClientIn");

            //if (client_count > 0)
            {
                UpdateClientStatus();
            }
        }
Beispiel #13
0
        //before retry clear connection
        private async Task onRetry(Exception ex, int attempt)
        {
            if (currentConnection != null)
            {
                //close connection on error
                await tcpConnectionFactory.Release(currentConnection, true);

                currentConnection = null;
            }
        }
        private void _server_OnConnect(TcpServerConnection connection)
        {
            _server.Send($"Welcome!{_nl}");
            InvokeDelegate del = () =>
            {
                EndPoint ep = connection.Socket.Client.RemoteEndPoint;
                handleInput($"Remote endpoint : {ep}{_nl}");
            };

            Invoke(del);
        }
Beispiel #15
0
        private void OnDisconnect(TcpServerConnection connection)
        {
            string alias   = GetAlias(connection);
            bool   removed = aliases.TryRemove(connection, out _);

            serverWindow.PrintLine("<" + alias + "> disconnected.");
            if (removed)
            {
                TrySendMessage("USER_DISCONNECTED|" + alias);
            }
            UpdateUserList();
        }
Beispiel #16
0
 private void Server_ClientConnected(object sender, TcpServerEventArgs e)
 {
     if (InvokeRequired)
     {
         BeginInvoke(new TCPMethod(Server_ClientConnected), new object[] { sender, e });
         return;
     }
     tcpClient = e.Client;
     e.Client.BytesReceived += Client_BytesReceived;
     e.Client.BytesSent     += Client_BytesSent;
     LogInfo(tcpServerLog, "Client Connected: " + tcpClient.ClientIPAddress);
 }
Beispiel #17
0
        private void OnDataAvailable(TcpServerConnection connection)
        {
            byte[] data = ReadStream(connection.Socket);

            if (data == null)
            {
                return;
            }
            string dataStr = Encoding.UTF8.GetString(data);

            HandleMessage(connection, dataStr);
        }
        public void DiscoveryServerOnDataAvailable(TcpServerConnection connection)
        {
            Logger.Trace("DiscoveryServer.OnDataAvailable: {0}", connection.ClientAddress.ToString());

            var client = connection.Socket;

            using (var stream = client.GetStream())
                using (var sw = new StreamWriter(stream))
                {
                    if (stream.DataAvailable)
                    {
                        var data = new byte[5013];

                        try
                        {
                            var bytesRead = stream.Read(data, 0, data.Length);

                            Logger.Debug("{1} Bytes Received: {0}", bytesRead, connection.ClientAddress);

                            var request = new EncoderRequest();
                            request.Deserialize(ref data);

                            foreach (var device in _settings.Devices)
                            {
                                foreach (var tuner in device.Tuners)
                                {
                                    if (tuner.Enabled)
                                    {
                                        var response = new EncoderResponse
                                        {
                                            Name    = tuner.Name,
                                            Length  = tuner.Name.Length,
                                            Prefix  = request.Prefix,
                                            Version = "210",
                                            Port    = (uint)tuner.ListenerPort
                                        };

                                        Logger.Debug("Sending:{0}", response);
                                        sw.Write(response);
                                    }
                                }
                            }

                            connection.ForceDisconnect();
                        }

                        catch (IOException ex)
                        {
                            Logger.Warn("IOException while reading stream", ex);
                        }
                    }
                }
        }
Beispiel #19
0
        public static void tcpServer_OnDataAvailable(TcpServerConnection connection)
        {
            var data = readStream(connection.Socket);

            if (data == null)
            {
                return;
            }

            string reply = ParseCheckResult(data);

            connection.sendData(reply);
        }
 //get the policy
 private Policy getRetryPolicy()
 {
     return(Policy.Handle <T>()
            .RetryAsync(retries,
                        onRetryAsync: async(ex, i, context) =>
     {
         if (currentConnection != null)
         {
             //close connection on error
             await tcpConnectionFactory.Release(currentConnection, true);
             currentConnection = null;
         }
     }));
 }
Beispiel #21
0
        /// <summary>
        ///     Handle upgrade to websocket
        /// </summary>
        private async Task handleWebSocketUpgrade(string requestHttpMethod, string requestHttpUrl, Version requestVersion,
                                                  SessionEventArgs args, Request request, Response response,
                                                  CustomBufferedStream clientStream, HttpResponseWriter clientStreamWriter,
                                                  TcpServerConnection serverConnection,
                                                  CancellationTokenSource cancellationTokenSource, CancellationToken cancellationToken)
        {
            // prepare the prefix content
            var headerBuilder = new HeaderBuilder();

            headerBuilder.WriteRequestLine(requestHttpMethod, requestHttpUrl, requestVersion);
            headerBuilder.WriteHeaders(request.Headers);
            await serverConnection.StreamWriter.WriteHeadersAsync(headerBuilder, cancellationToken);

            string httpStatus;

            try
            {
                httpStatus = await serverConnection.Stream.ReadLineAsync(cancellationToken)
                             ?? throw new ServerConnectionException("Server connection was closed.");
            }
            catch (Exception e) when(!(e is ServerConnectionException))
            {
                throw new ServerConnectionException("Server connection was closed.", e);
            }

            Response.ParseResponseLine(httpStatus, out var responseVersion,
                                       out int responseStatusCode,
                                       out string responseStatusDescription);
            response.HttpVersion       = responseVersion;
            response.StatusCode        = responseStatusCode;
            response.StatusDescription = responseStatusDescription;

            await HeaderParser.ReadHeaders(serverConnection.Stream, response.Headers,
                                           cancellationToken);

            if (!args.IsTransparent)
            {
                await clientStreamWriter.WriteResponseAsync(response,
                                                            cancellationToken : cancellationToken);
            }

            // If user requested call back then do it
            if (!args.HttpClient.Response.Locked)
            {
                await onBeforeResponse(args);
            }

            await TcpHelper.SendRaw(clientStream, serverConnection.Stream, BufferPool,
                                    args.OnDataSent, args.OnDataReceived, cancellationTokenSource, ExceptionFunc);
        }
Beispiel #22
0
        void OnConnect(TcpServerConnection connection)
        {
            NetworkStream stream = connection.Socket.GetStream();
            ClientRequest req    = null;

            try
            {
                req = ClientRequest.ReceiveFrom(stream);
            }
            catch
            {
                return;
            }

            if (req.Purpose == RequestPurpose.Login)
            {
                if (FreeSlots > 0 && CurrentGame.Phase == GamePhase.Lobby)
                {
                    ServersideClientInfo client = new ServersideClientInfo();
                    client.Connection        = connection;
                    client.PlayerName        = (string)req.Data[0];
                    client.CharacterToString = (string)req.Data[1];
                    client.ClientID          = Clients.Count;
                    Clients.Add(client);

                    ServerResponse toSend = new ServerResponse();
                    toSend.Purpose = ResponseType.LoginAccepted;
                    toSend.Data    = new object[] { client.ClientID, ClientsideServerInfo.FromServer(this) };
                    toSend.SendTo(stream);
                }
                else
                {
                    ServerResponse toSend = new ServerResponse();
                    toSend.Purpose = ResponseType.ActionDenied;
                    toSend.Data    = new object[] { "" };
                    if (FreeSlots == 0)
                    {
                        toSend.Data[0] = "Server full";
                    }
                    else
                    {
                        toSend.Data[0] = "Game in progress";
                    }

                    toSend.SendTo(stream);
                    server.Connections.Remove(connection);
                }
            }
        }
        private async Task handleHttpSessionRequest(TcpServerConnection connection, SessionEventArgs args)
        {
            var cancellationToken = args.CancellationTokenSource.Token;
            var request           = args.HttpClient.Request;

            request.Locked = true;

            var body = request.CompressBodyAndUpdateContentLength();

            // set the connection and send request headers
            args.HttpClient.SetConnection(connection);
            await args.HttpClient.SendRequest(Enable100ContinueBehaviour, args.IsTransparent,
                                              cancellationToken);

            // If a successful 100 continue request was made, inform that to the client and reset response
            if (request.ExpectationSucceeded)
            {
                var clientStreamWriter = args.ProxyClient.ClientStreamWriter;
                var response           = args.HttpClient.Response;

                var headerBuilder = new HeaderBuilder();
                headerBuilder.WriteResponseLine(response.HttpVersion, response.StatusCode, response.StatusDescription);
                headerBuilder.WriteHeaders(response.Headers);
                await clientStreamWriter.WriteHeadersAsync(headerBuilder, cancellationToken);

                await args.ClearResponse(cancellationToken);
            }

            // send body to server if available
            if (request.HasBody)
            {
                if (request.IsBodyRead)
                {
                    var writer = args.HttpClient.Connection.StreamWriter;
                    await writer.WriteBodyAsync(body !, request.IsChunked, cancellationToken);
                }
                else if (!request.ExpectationFailed)
                {
                    // get the request body unless an unsuccessful 100 continue request was made
                    HttpWriter writer = args.HttpClient.Connection.StreamWriter !;
                    await args.CopyRequestBodyAsync(writer, TransformationMode.None, cancellationToken);
                }
            }

            args.TimeLine["Request Sent"] = DateTime.Now;

            // parse and send response
            await handleHttpSessionResponse(args);
        }
Beispiel #24
0
        public ServerConnectionVM(TcpServerConnection connection)
        {
            Rooms = new ObservableCollection <string>();

            _tcpConnection = connection;
            _tcpConnection.IsConnectedChanged += TcpConnection_OnConnectedChanged;

            _control = new ServerConnectionView {
                DataContext = this
            };
            _control.ConnectButton.Click       += ConnectButton_Click;
            _control.AddressTextBox.KeyDown    += AddressTextBox_KeyDown;
            _control.RefreshRoomsButton.Click  += (s, e) => _tcpConnection.RefreshRooms(Rooms);
            _control.CreateNewRoom.Click       += (s, e) => _tcpConnection.CreateRoom(_control.NewRoomName.Text, _control.NewRoomPassword.Text);
            _control.ConnectToRoomButton.Click += ConnectToRoomButton_Click;
        }
        private void send_response(string response, TcpServerConnection connection)
        {
            try
            {
                NetworkStream stream = connection.Socket.GetStream();

                byte[] bytes;

                bytes = Encoding.UTF8.GetBytes(response.ToCharArray(), 0, response.Length);
                stream.Write(bytes, 0, response.Length);
            }
            catch (Exception e)
            {
                OnLog(new LogEventArgs("Error sending response: " + e.Message));
            }
        }
        private void _server_OnDataAvailable(TcpServerConnection connection)
        {
            byte[] data = ReadStream(connection.Socket);

            if (data != null)
            {
                string dataStr = Encoding.ASCII.GetString(data);

                InvokeDelegate del = () =>
                {
                    handleInput($"{dataStr}{_nl}");
                };
                Invoke(del);

                data = null;
            }
        }
Beispiel #27
0
        public void SendingDatawithTCPServerIsReceivedCorrectly()
        {
            using (var server = CreateServer())
            {
                var resetEvent = new ManualResetEvent(false);
                TcpServerConnection <int> data = null;
                server.ConnectionStarted += (sender, serverData) =>
                {
                    data = serverData;
                    resetEvent.Set();
                };

                var tcpClient = Connect(resetEvent);

                SendRandomData(data);
                ReceiveToTcpClient(tcpClient);
            }
        }
Beispiel #28
0
        private void runListener()
        {
            while (m_isOpen && m_port >= 0)
            {
                try
                {
                    if (listener.Pending())
                    {
                        TcpClient           socket = listener.AcceptTcpClient();
                        TcpServerConnection conn   = new TcpServerConnection(socket, m_encoding);

                        if (OnConnect != null)
                        {
                            lock (activeThreadsLock)
                            {
                                activeThreads++;
                            }
                            conn.CallbackThread = new Thread(() =>
                            {
                                OnConnect(conn);
                            });
                            conn.CallbackThread.Start();
                        }

                        lock (connections)
                        {
                            connections.Add(conn);
                        }
                    }
                    else
                    {
                        System.Threading.Thread.Sleep(m_idleTime);
                    }
                }
                catch (ThreadInterruptedException) { } //thread is interrupted when we quit
                catch (Exception e)
                {
                    if (m_isOpen && OnError != null)
                    {
                        OnError(this, e);
                    }
                }
            }
        }
Beispiel #29
0
        private void _tcpServer_OnDataAvailable(TcpServerConnection connection)
        {
            byte[] data = readStream(connection.Socket);

            if (data != null)
            {
                //string dataStr = Encoding.ASCII.GetString(data);
                try
                {
                    invokeDelegate del = () =>
                    {
                        ParseSvsData(data);
                    };
                    Invoke(del);
                    data = null;
                }
                catch { }
            }
        }
Beispiel #30
0
        public void OnDataAvailable(TcpServerConnection connection)
        {
            Logger.Trace("TcpServer.OnDataAvailable: {0}", connection.ClientAddress.ToString());

            var client = connection.Socket;

            using (var stream = client.GetStream())
                using (var sw = new StreamWriter(stream))
                {
                    if (stream.DataAvailable)
                    {
                        var data = new byte[5013];

                        var stringBuilder = new StringBuilder();

                        try
                        {
                            do
                            {
                                var bytesRead = stream.Read(data, 0, data.Length);

                                Logger.Debug("{1}:{2} Bytes Received: {0}", bytesRead, connection.ClientAddress, _tunerSettings.ListenerPort);

                                stringBuilder.Append(Encoding.UTF8.GetString(data, 0, bytesRead));
                                string str = stringBuilder.ToString();

                                if (!string.IsNullOrEmpty(str) && str.Length > 2 && str.Substring(str.Length - 2) == "\r\n")
                                {
                                    var response = HandleRequest(stringBuilder.ToString().Trim());
                                    Logger.Debug("Sending:{0}", response);
                                    sw.Write(response + Environment.NewLine);
                                }
                            }while (client.Available > 0);
                        }

                        catch (IOException ex)
                        {
                            Logger.Warn("IOException while reading stream", ex);
                        }
                    }
                }
        }