Exemple #1
0
        public void Dispose()
        {
            try
            {
                if (IsConnected)
                {
                    server?.DisconnectClient(client);
                }
            }
            catch (Exception)
            {
                // ignored
            }

            try
            {
                server?.Dispose();
            }
            catch (Exception)
            {
                // ignored
            }
        }
Exemple #2
0
        void DisconnectClientTest(TcpClient client, TcpServer server, IPEndPoint endPoint)
        {
            ServerConnectedEventArgs      = null;
            ServerDisconnectedEventArgs   = null;
            ClientConnectedEventEventArgs = null;
            Assert.IsNull(ServerConnectedEventArgs);
            Assert.IsNull(ServerDisconnectedEventArgs);
            Assert.IsNull(ClientConnectedEventEventArgs);
            client.Start(endPoint);
            var waitStart = DateTime.Now;

            while (ServerConnectedEventArgs == null || ClientConnectedEventEventArgs == null)
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail("Wait Timeout");
                }
            }
            Assert.IsNotNull(ClientConnectedEventEventArgs);
            Assert.IsNotNull(ServerConnectedEventArgs);
            Assert.IsNull(ServerDisconnectedEventArgs);
            Assert.AreEqual(endPoint, ServerConnectedEventArgs.LocalEndPoint);
            Assert.AreEqual(endPoint, ClientConnectedEventEventArgs.RemoteEndPoint);

            var clientLocalEp = ClientConnectedEventEventArgs.LocalEndPoint;

            var remoteIp = ServerConnectedEventArgs.RemoteEndPoint;
            var localIp  = ServerConnectedEventArgs.LocalEndPoint;

            ServerConnectedEventArgs    = null;
            ServerDisconnectedEventArgs = null;
            Assert.IsNull(ServerConnectedEventArgs);
            Assert.IsNull(ServerDisconnectedEventArgs);
            server.DisconnectClient((IPEndPoint)localIp, (IPEndPoint)remoteIp);
            waitStart = DateTime.Now;
            while (!Equals(ServerDisconnectedEventArgs?.RemoteEndPoint, clientLocalEp))
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail("Wait Timeout");
                }
            }
            Assert.IsNotNull(ServerDisconnectedEventArgs);
            Assert.AreEqual(endPoint, ServerDisconnectedEventArgs.LocalEndPoint);
            Assert.AreEqual(remoteIp, ServerDisconnectedEventArgs.RemoteEndPoint);

            //Wait before client will be connected once again.
            waitStart = DateTime.Now;
            ClientConnectedEventEventArgs = null;
            while (ServerConnectedEventArgs == null || ClientConnectedEventEventArgs == null)
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail("Wait Timeout");
                }
            }

            Assert.IsNotNull(ClientConnectedEventEventArgs);
            Assert.AreEqual(endPoint, ClientConnectedEventEventArgs.RemoteEndPoint);
            clientLocalEp = ClientConnectedEventEventArgs.LocalEndPoint;
            remoteIp      = ServerConnectedEventArgs.RemoteEndPoint;

            //Disconnect client.
            ServerDisconnectedEventArgs = null;
            client.Stop();

            waitStart = DateTime.Now;
            while (!Equals(ServerDisconnectedEventArgs?.RemoteEndPoint, clientLocalEp))
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail($"Wait Timeout: expected{ServerDisconnectedEventArgs?.RemoteEndPoint} actual {clientLocalEp}");
                }
            }

            Assert.IsNotNull(ServerDisconnectedEventArgs);
            Assert.AreEqual(endPoint, ServerDisconnectedEventArgs.LocalEndPoint);
            Assert.AreEqual(remoteIp, ServerDisconnectedEventArgs.RemoteEndPoint);
        }
Exemple #3
0
 public void DisconnectGuestSocket(Socket other) //(내가 호스트일때) 특정 게스트와 연결을 끊는다.
 {
     m_host.DisconnectClient(other);
 }
Exemple #4
0
        static void Main(string[] args)
        {
            InitializeServer();
            _Server.Start();

            Console.WriteLine("Listening on tcp://127.0.0.1:8000");

            while (_RunForever)
            {
                Console.Write("Command [? for help]: ");
                string userInput = Console.ReadLine();
                if (String.IsNullOrEmpty(userInput))
                {
                    continue;
                }

                if (userInput.Equals("?"))
                {
                    Console.WriteLine("-- Available Commands --");
                    Console.WriteLine("");
                    Console.WriteLine("   cls                     Clear the screen");
                    Console.WriteLine("   q                       Quit the program");
                    Console.WriteLine("   list                    List connected clients");
                    Console.WriteLine("   send [ipport] [data]    Send data to a specific client");
                    Console.WriteLine("   read [ipport] [count]   Read [count] bytes from a specific client");
                    Console.WriteLine("   kick [ipport]           Disconnect a specific client from the server");
                    Console.WriteLine("   dispose                 Dispose of the server");
                    Console.WriteLine("   start                   Start the server (running: " + (_Server != null ? _Server.IsListening.ToString() : "false") + ")");
                    Console.WriteLine("   stats                   Retrieve statistics");
                    Console.WriteLine("");
                    continue;
                }

                if (userInput.Equals("c") || userInput.Equals("cls"))
                {
                    Console.Clear();
                    continue;
                }

                if (userInput.Equals("q"))
                {
                    _RunForever = false;
                    break;
                }

                if (userInput.Equals("list"))
                {
                    List <string> clients = _Server.GetClients().ToList();
                    if (clients != null)
                    {
                        Console.WriteLine("Clients: " + clients.Count);
                        foreach (string curr in clients)
                        {
                            Console.WriteLine("  " + curr);
                        }
                    }
                    else
                    {
                        Console.WriteLine("(null)");
                    }
                }

                if (userInput.StartsWith("send "))
                {
                    string[] parts  = userInput.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries);
                    string   ipPort = parts[1];
                    string   data   = parts[2];

                    _Server.Send(ipPort, data);
                }

                if (userInput.StartsWith("read "))
                {
                    string[] parts  = userInput.Split(new char[] { ' ' }, 3, StringSplitOptions.RemoveEmptyEntries);
                    string   ipPort = parts[1];
                    int      count  = Convert.ToInt32(parts[2]);

                    ReadResult rr = _Server.Read(ipPort, count);
                    if (rr.Status == ReadResultStatus.Success)
                    {
                        Console.WriteLine("Retrieved " + rr.BytesRead + " bytes: " + Encoding.UTF8.GetString(rr.Data));
                    }
                    else
                    {
                        Console.WriteLine("Non-success status: " + rr.Status.ToString());
                    }
                }

                if (userInput.StartsWith("kick "))
                {
                    string[] parts  = userInput.Split(new char[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries);
                    string   ipPort = parts[1];

                    _Server.DisconnectClient(ipPort);
                }

                if (userInput.Equals("dispose"))
                {
                    _Server.Dispose();
                }

                if (userInput.Equals("start"))
                {
                    InitializeServer();
                    _Server.Start();
                }

                if (userInput.Equals("stats"))
                {
                    Console.WriteLine(_Server.Stats);
                }
            }
        }
Exemple #5
0
        static void Main(string[] args)
        {
            _ListenerIp   = InputString("Listener IP:", "127.0.0.1", false);
            _ListenerPort = InputInteger("Listener Port:", 9000, true, false);
            _Ssl          = InputBoolean("Use SSL:", false);

            if (_Ssl)
            {
                _PfxFilename = InputString("PFX Certificate File:", "simpletcp.pfx", false);
                _PfxPassword = InputString("PFX File Password:"******"simpletcp", false);
            }

            _Server = new TcpServer(_ListenerIp, _ListenerPort, _Ssl, _PfxFilename, _PfxPassword);

            _Server.ClientConnected    += ClientConnected;
            _Server.ClientDisconnected += ClientDisconnected;
            _Server.DataReceived       += DataReceived;

            _Server.IdleClientTimeoutSeconds  = 10;
            _Server.MutuallyAuthenticate      = false;
            _Server.AcceptInvalidCertificates = true;
            _Server.Logger = Logger;
            _Server.Start();

            while (_RunForever)
            {
                string userInput = InputString("Command [? for help]:", null, false);
                switch (userInput)
                {
                case "?":
                    Menu();
                    break;

                case "q":
                case "Q":
                    _RunForever = false;
                    break;

                case "c":
                case "C":
                case "cls":
                    Console.Clear();
                    break;

                case "list":
                    ListClients();
                    break;

                case "send":
                    Send();
                    break;

                case "remove":
                    Console.Write("IP:Port: ");
                    string ipPort = Console.ReadLine();
                    _Server.DisconnectClient(ipPort);
                    break;

                case "dispose":
                    _Server.Dispose();
                    break;

                case "stats":
                    Console.WriteLine(_Server.Stats.ToString());
                    break;

                case "stats reset":
                    _Server.Stats.Reset();
                    break;
                }
            }
        }
        void DisconnectClientTest(TcpClient client, TcpServer server, IPEndPoint endPoint, string serverName, X509Certificate clientCertificate,
                                  SslProtocols enabledSslProtocols,
                                  bool checkCertificateRevocation,
                                  EncryptionPolicy encryptionPolicy)
        {
            ServerConnectedEventArgs      = null;
            ServerDisconnectedEventArgs   = null;
            ClientConnectedEventEventArgs = null;
            Assert.IsNull(ServerConnectedEventArgs);
            Assert.IsNull(ServerDisconnectedEventArgs);
            Assert.IsNull(ClientConnectedEventEventArgs);
            client.Start(endPoint, serverName, clientCertificate, enabledSslProtocols, checkCertificateRevocation, encryptionPolicy);
            var waitStart = DateTime.Now;

            while (ServerConnectedEventArgs == null || ClientConnectedEventEventArgs == null)
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail("Wait Timeout");
                }
            }
            Assert.IsNotNull(ClientConnectedEventEventArgs);
            Assert.IsNotNull(ServerConnectedEventArgs);
            Assert.IsNull(ServerDisconnectedEventArgs);
            Assert.AreEqual(endPoint, ServerConnectedEventArgs.LocalEndPoint);
            Assert.AreEqual(endPoint, ClientConnectedEventEventArgs.RemoteEndPoint);

            var clientLocalEp = ClientConnectedEventEventArgs.LocalEndPoint;

            var remoteIp = ServerConnectedEventArgs.RemoteEndPoint;
            var localIp  = ServerConnectedEventArgs.LocalEndPoint;

            ServerConnectedEventArgs    = null;
            ServerDisconnectedEventArgs = null;
            Assert.IsNull(ServerConnectedEventArgs);
            Assert.IsNull(ServerDisconnectedEventArgs);
            server.DisconnectClient((IPEndPoint)localIp, (IPEndPoint)remoteIp);
            waitStart = DateTime.Now;
            while (!Equals(ServerDisconnectedEventArgs?.RemoteEndPoint, clientLocalEp))
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail("Wait Timeout");
                }
            }
            Assert.IsNotNull(ServerDisconnectedEventArgs);
            Assert.AreEqual(endPoint, ServerDisconnectedEventArgs.LocalEndPoint);
            Assert.AreEqual(remoteIp, ServerDisconnectedEventArgs.RemoteEndPoint);

            //Wait before client will be connected once again.
            waitStart = DateTime.Now;
            ClientConnectedEventEventArgs = null;
            while (ServerConnectedEventArgs == null || ClientConnectedEventEventArgs == null)
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail("Wait Timeout");
                }
            }

            Assert.IsNotNull(ClientConnectedEventEventArgs);
            Assert.AreEqual(endPoint, ClientConnectedEventEventArgs.RemoteEndPoint);
            clientLocalEp = ClientConnectedEventEventArgs.LocalEndPoint;
            remoteIp      = ServerConnectedEventArgs.RemoteEndPoint;

            //Disconnect client.
            ServerDisconnectedEventArgs = null;
            client.Stop();

            waitStart = DateTime.Now;
            while (!Equals(ServerDisconnectedEventArgs?.RemoteEndPoint, clientLocalEp))
            {
                Thread.Sleep(1);
                var delta = DateTime.Now - waitStart;
                if (delta.TotalSeconds > 5)
                {
                    Assert.Fail($"Wait Timeout: expected{ServerDisconnectedEventArgs?.RemoteEndPoint} actual {clientLocalEp}");
                }
            }

            Assert.IsNotNull(ServerDisconnectedEventArgs);
            Assert.AreEqual(endPoint, ServerDisconnectedEventArgs.LocalEndPoint);
            Assert.AreEqual(remoteIp, ServerDisconnectedEventArgs.RemoteEndPoint);
        }