예제 #1
0
        /// <summary>
        /// Starten des Servers
        /// </summary>
        public void Start(string strIPAdress, int Port)
        {
            //Endpoint und Listener bestimmen
            m_endpoint = new IPEndPoint(IPAddress.Parse(strIPAdress), Port);
            m_tcpip    = new TcpListener(m_endpoint);

            if (m_tcpip == null)
            {
                return;
            }

            try
            {
                m_tcpip.Start();

                // Haupt-TCPServer-Thread initialisieren und starten
                m_ThreadMainServer = new Thread(new ThreadStart(Run));
                m_ThreadMainServer.Start();

                //State setzen
                this.m_State = ListenerState.Started;
            }
            catch (Exception ex)
            {
                //Beenden
                m_tcpip.Stop();
                this.m_State = ListenerState.Error;

                //Exception werfen
                throw ex;
            }
        }
예제 #2
0
    private void transitionToVerified()
    {
        listenerStatus = ListenerState.VERIFIED;
        Debug.Log("verified");

        InvokeRepeating("pollPayPalExecutePaymentAPI", 0f, listeningInterval);
    }
예제 #3
0
        public IRCClient()
        {
            initEvent = new ManualResetEvent(false);
            tcp       = new TcpClient(AddressFamily.InterNetwork);

            State = ListenerState.Stoped;
        }
예제 #4
0
        public void Start()
        {
            using (var database = new RozmawiatorDb())
            {
                var server = database.Servers.Find(_serverGuid);
                if (server == null)
                {
                    server = new Database.Entities.Server
                    {
                        Id = _serverGuid,
                    };
                    database.Servers.Add(server);
                }
                server.IpAddress = "192.168.88.19";
                server.Port      = Configuration.Host.ListenPort;
                server.State     = ServerState.Online;
                database.SaveChanges();
            }

            Port        = Configuration.Host.ListenPort;
            TimeoutSpan = Configuration.Client.Timeout;

            _listener = new UdpClient(Port);
            _clients.Clear();
            _conversations.Clear();

            State = ListenerState.Listening;

            Task.Factory.StartNew(ListenLoop);
        }
예제 #5
0
        public void Init(uint maxConnetion = 500)
        {
            if (State != ListenerState.Idle)
            {
                return;
            }
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint iep = new IPEndPoint(IPAddress.Any, port);

            //if (localEndPoint.AddressFamily == AddressFamily.InterNetworkV6)
            //{
            //    // 配置监听socket为 dual-mode (IPv4 & IPv6)
            //    // 27 is equivalent to IPV6_V6ONLY socket option in the winsock snippet below,
            //    _serverSock.SetSocketOption(SocketOptionLevel.IPv6, (SocketOptionName)27, false);
            //    _serverSock.Bind(new IPEndPoint(IPAddress.IPv6Any, localEndPoint.Port));
            //}
            //else
            //{
            //    _serverSock.Bind(localEndPoint);
            //}
            try
            {
                socket.Bind(iep);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
            socket.Listen((int)maxConnetion);
            State = ListenerState.Loaded;
        }
예제 #6
0
        public void Run()
        {
            Console.WriteLine("Runing IRCClient...");
            State = ListenerState.Loading;

            tcp.ConnectAsync(Config.Host, Config.Port).Wait();
            if (!tcp.Connected)
            {
                Console.WriteLine("Error connect to {0}:{1}", Config.Host, Config.Port);
                State = ListenerState.Error;
                return;
            }

            var stream = tcp.GetStream();

            sr = new StreamReader(stream);
            sw = new StreamWriter(stream);

            sw.WriteLine("PASS oauth:{0}", Config.Token);
            sw.WriteLine("NICK {0}", Config.Login);
            sw.Flush();

            Task.Run((Action)resiveLoop);
            Task.Run((Action)timerLoop);

            initEvent.WaitOne();
            State = ListenerState.Run;

            Console.WriteLine("Listener ready");
        }
 private void Handler(object sender, MouseEventArgs args)
 {
     if (State == ListenerState.Normal)
     {
         State = ListenerState.Marked;
     }
 }
예제 #8
0
        public void Stop()
        {
            using (var database = new RozmawiatorDb())
            {
                var server = database.Servers.Find(_serverGuid);
                if (server != null)
                {
                    server.State = ServerState.Offline;
                    database.SaveChanges();
                }
            }

            foreach (var conversation in _conversations.ToArray())
            {
                conversation.Close();
            }

            foreach (var client in _clients.ToArray())
            {
                RemoveClient(client);
            }

            State = ListenerState.Idle;
            _listener.Close();
        }
예제 #9
0
            /// <summary>
            /// The function that triggers the event loop for client connections
            /// </summary>
            /// <param name="callMe"></param>
            /// <param name="ID"></param>
            public static void ServerAwaitingClientLoop(SocketState.callMe callMe, int ID)
            {
                int         port     = 11000;
                TcpListener listener = new TcpListener(IPAddress.Any, port);

                listener.Start();
                ListenerState ls = new ListenerState(callMe, listener, ID);

                listener.BeginAcceptSocket(AcceptNewClient, ls);
            }
예제 #10
0
            /// <summary>
            /// The function that continues the event loop for each new client connection
            /// </summary>
            /// <param name="ar"></param>
            public static void AcceptNewClient(IAsyncResult ar)
            {
                ListenerState ls     = (ListenerState)ar.AsyncState;
                Socket        socket = ls.listener.EndAcceptSocket(ar);
                SocketState   ss     = new SocketState(socket, ls._call, ls.ID);

                ss._call(ss);
                ls.ID++;
                ls.listener.BeginAcceptSocket(AcceptNewClient, ls);
            }
예제 #11
0
 public bool Stop()
 {
     if (State != ListenerState.Runing)
     {
         return(true);
     }
     socket.Close();
     State = ListenerState.Idle;
     return(true);
 }
예제 #12
0
파일: Listener.cs 프로젝트: mhinze/hashin
        public void StartAsync(ListeningScenario listening)
        {
            daemon = new HttpListener();
            daemon.Prefixes.Add(listening.Prefix);

            daemon.Start();

            var listenerState = new ListenerState(daemon, listening);

            daemon.BeginGetContext(Callback, listenerState);
        }
예제 #13
0
        public void StartAsync(ListeningScenario listening)
        {
            NewDaemon();

            daemon.Prefixes.Add(listening.Prefix);

            daemon.Start();

            var listenerState = new ListenerState(daemon, listening);

            daemon.BeginGetContext(Callback, listenerState);
        }
예제 #14
0
        public void Listen()
        {
            _listeningSocket = _socketFactory.CreateListeningSocket();

            EndPoint remoteEndpoint = new IPEndPoint(IPAddress.Any, Constants.MulticastPort);
            var listenerState = new ListenerState();

            _listeningSocket.BeginReceiveFrom(listenerState.Buffer,
                ref remoteEndpoint, OnReceive, listenerState);

            _stopped = false;
            _started = true;
        }
예제 #15
0
        static void ClientListener(ref ListenerState state)
        {
            TcpListener server = new TcpListener(iPAddress, DesktopPort);

            server.Start();
            while (true)
            {
                state = ListenerState.Waiting;
                TcpClient client = server.AcceptTcpClient();

                NetworkStream stream = client.GetStream();

                //SslStream ssl = new SslStream(client.GetStream(), false);
                //ssl.AuthenticateAsServer(X509, false, true);

                state = ListenerState.UsernameSub;
                while (client.Available < 3)
                {
                    if (state == ListenerState.Quiting)
                    {
                        break;
                    }
                }
                if (state == ListenerState.Quiting)
                {
                    server.Stop();
                    break;
                }

                Message message = MessageHelpers.GetMessage(stream);
                if (message.MessageType == MessageType.Initionalize && clients.Any(x => x.Value.Name == message.Name) == false)
                {
                    ClientInfo c = new ClientInfo(message.Name, stream, ClientType.Desktop);
                    clients.Add(c.GUID, c);
                    ThreadPool.QueueUserWorkItem(HandleClientDesktopWorker, c);
                    state = ListenerState.Connected;
                }
                else
                {
                    state = ListenerState.Disconnected;
                    Message h = new Message(message.Name, MessageType.Status);
                    h.SetStatusType(StatusType.ErrorDisconnect);
                    h.SetContent("User with the name " + message.Name + " already exists");
                    MessageHelpers.SetMessage(stream, h);
                    stream.Close();
                    stream.Dispose();
                    client.Close();
                    client.Dispose();
                }
            }
        }
            public MouseListenerData(UIElement el)
            {
                State = ListenerState.Marked;

                _target = el;
                _target.PreviewMouseLeftButtonDown  += Handler;
                _target.PreviewMouseLeftButtonUp    += Handler;
                _target.PreviewMouseMove            += Handler;
                _target.PreviewMouseRightButtonDown += Handler;
                _target.PreviewMouseRightButtonUp   += Handler;
                _target.PreviewMouseWheel           += Handler;
                _target.PreviewMouseDown            += Handler;
                _target.PreviewMouseUp += Handler;
            }
            public StylusListenerData(UIElement el)
            {
                State = ListenerState.Marked;

                _target = el;
                _target.PreviewStylusButtonDown    += Handler;
                _target.PreviewStylusButtonUp      += Handler;
                _target.PreviewStylusDown          += Handler;
                _target.PreviewStylusInAirMove     += Handler;
                _target.PreviewStylusInRange       += Handler;
                _target.PreviewStylusMove          += Handler;
                _target.PreviewStylusOutOfRange    += Handler;
                _target.PreviewStylusSystemGesture += Handler;
                _target.PreviewStylusUp            += Handler;
            }
예제 #18
0
        public BilibiliListener()
        {
            Trace.TraceInformation("BilibiliListener: Create bilibili comments listener.");
            var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config/bilibili.config");

            State = ListenerState.Disconnected;
            try
            {
                var json = JToken.Parse(File.ReadAllText(path));
                LiveRoomID = json["roomid"].ToObject <int>();
            }
            catch (Exception exc) {
                Trace.TraceError("BilibiliListener: Failed to load config from " + path);
                Trace.TraceError(exc.Message);
                Trace.TraceError(exc.StackTrace);
            }
        }
예제 #19
0
        public void Stop()
        {
            try
            {
                if (m_ThreadMainServer != null)
                {
                    // Haupt-TCPServer-Thread stoppen
                    m_ThreadMainServer.Abort();
                    System.Threading.Thread.Sleep(100);
                }

                // Alle TCPServer-Threads stoppen
                for (IEnumerator en = m_threads.GetEnumerator(); en.MoveNext();)
                {
                    //Nächsten TCPServer-Thread holen
                    ServerThread st = (ServerThread)en.Current;
                    //und stoppen
                    st.Stop();

                    //Event abschicken
                    if (ClientDisconnected != null)
                    {
                        ClientDisconnected(st, "Verbindung wurde beendet");
                    }
                }

                if (m_tcpip != null)
                {
                    //Listener stoppen
                    m_tcpip.Stop();
                    m_tcpip.Server.Close();
                }

                //Liste leeren
                m_threads.Clear();
                //Status vermerken
                this.m_State = ListenerState.Stopped;
            }
            catch (Exception)
            {
                this.m_State = ListenerState.Error;
            }
        }
예제 #20
0
        /// <summary>
        /// 开始监听
        /// </summary>
        /// <returns></returns>
        public void Start(SocketAsyncEventArgs acceptEventArgs = null)
        {
            if (State != ListenerState.Loaded)
            {
                Init();
            }

            if (acceptEventArgs == null)
            {
                acceptEventArgs            = new SocketAsyncEventArgs();
                acceptEventArgs.Completed += new EventHandler <SocketAsyncEventArgs>(e_Completed);
            }
            else
            {
                acceptEventArgs.AcceptSocket = null; //释放上次绑定的Socket,等待下一个Socket连接
            }
            bool willRaiseEvent = socket.AcceptAsync(acceptEventArgs);

            if (!willRaiseEvent)
            {
                Start();
            }
            State = ListenerState.Runing;
        }
예제 #21
0
 private void transitionToFailure()
 {
     listenerStatus = ListenerState.FAILURE;
     CancelInvoke("pollPayPalExecutePaymentAPI");
 }
예제 #22
0
 private void transitionToSuccess()
 {
     listenerStatus = ListenerState.SUCCESS;
     CancelInvoke("pollPayPalExecutePaymentAPI");
 }
예제 #23
0
        /// <summary>
        /// Beenden des Servers
        /// </summary>
        public void Stop()
        {
            try
            {
                if (m_ThreadMainServer != null)
                {
                    // Haupt-TCPServer-Thread stoppen
                    m_ThreadMainServer.Abort();
                    System.Threading.Thread.Sleep(100);
                }

                // Alle TCPServer-Threads stoppen
                for (IEnumerator en = m_threads.GetEnumerator(); en.MoveNext(); )
                {
                    //Nächsten TCPServer-Thread holen
                    ServerThread st = (ServerThread)en.Current;
                    //und stoppen
                    st.Stop();

                    //Event abschicken
                    if (ClientDisconnected != null)
                    {
                        ClientDisconnected(st, "Verbindung wurde beendet");
                    }
                }

                if (m_tcpip != null)
                {
                    //Listener stoppen
                    m_tcpip.Stop();
                    m_tcpip.Server.Close();
                }

                //Liste leeren
                m_threads.Clear();
                //Status vermerken
                this.m_State = ListenerState.Stopped;

            }
            catch (Exception)
            {
                this.m_State = ListenerState.Error;
            }
        }
예제 #24
0
        /// <summary>
        /// 启动服务器
        /// </summary>
        /// <param name="Port">监听端口号</param>
        public void Start(int Port)
        {
            //Endpoint und Listener bestimmen
            m_endpoint = new IPEndPoint(IPAddress.Any, Port);
            m_tcpip = new TcpListener(m_endpoint);

            if (m_tcpip == null) return;

            try
            {
                m_tcpip.Start();

                // Haupt-TCPServer-Thread initialisieren und starten
                m_ThreadMainServer = new Thread(new ThreadStart(Run));
                m_ThreadMainServer.Start();

                //State setzen
                this.m_State = ListenerState.Started;
            }
            catch (Exception ex)
            {
                //Beenden
                m_tcpip.Stop();
                this.m_State = ListenerState.Error;

                //Exception werfen
                throw ex;
            }
        }
예제 #25
0
 public TcpListener(int port)
 {
     State     = ListenerState.Idle;
     socket    = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     this.port = port;
 }
예제 #26
0
        static void Main(string[] args)
        {
            clients = new Dictionary <string, ClientInfo>();
            Rooms   = new Dictionary <string, Room>();

            Room m = new Room("Main", 0);

            Rooms[m.GUID] = m;
            m             = new Room("Extra", 1);
            Rooms[m.GUID] = m;

            #region Config loading code
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("Loading Configuration...");
            XmlDocument settings = new XmlDocument();
            settings.Load("config.xml");
            XmlNode     roomsNode = settings.SelectSingleNode("Config/Rooms");
            XmlNodeList rooms     = roomsNode.SelectNodes("Room");
            Console.ForegroundColor = ConsoleColor.DarkCyan;
            if (roomsNode.Attributes[0].InnerText == "true")
            {
                Console.WriteLine("Overriden Default Room(s)");
                Rooms = new Dictionary <string, Room>();
            }
            foreach (XmlNode node in rooms)
            {
                try
                {
                    XmlAttributeCollection attr = node.Attributes;
                    Console.WriteLine("Generating Room " + node.InnerText);
                    m             = new Room(node.InnerText, int.Parse(attr[0].InnerText), int.Parse(attr[1].InnerText), int.Parse(attr[2].InnerText));
                    Rooms[m.GUID] = m;
                }
                catch
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Failed to Generate Room " + node.InnerText);
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                }
            }
            string webPort = settings.SelectSingleNode("Config/GeneralSettings/WebPort").InnerText;
            if (webPort != "")
            {
                if (!int.TryParse(webPort, out WebPort))
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Failed to read WebPort, reverting to default port (8911)");
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Set WebPort to " + WebPort);
                }
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine("WebPort set to default (8911)");
            }
            string desktopPort = settings.SelectSingleNode("Config/GeneralSettings/DesktopPort").InnerText;
            if (desktopPort != "")
            {
                if (!int.TryParse(desktopPort, out DesktopPort))
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Failed to read DesktopPort, reverting to default port (8910)");
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Set DesktopPort to " + DesktopPort);
                }
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine("DesktopPort set to default (8910)");
            }
            string ip = settings.SelectSingleNode("Config/GeneralSettings/ServerIp").InnerText;
            if (ip != "")
            {
                if (!IPAddress.TryParse(ip, out iPAddress))
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Failed to read ServerIp, reverting to default (Automatic " + GetLocalIPAddress() + ")");
                    iPAddress = IPAddress.Parse(GetLocalIPAddress());
                }
                else
                {
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Set ServerIp to " + iPAddress.ToString());
                }
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.DarkCyan;
                Console.WriteLine("Automaticly setting ip to " + GetLocalIPAddress());
                iPAddress = IPAddress.Parse(GetLocalIPAddress());
            }
            try
            {
                if (!bool.TryParse(settings.SelectSingleNode("Config/GeneralSettings/WebPort").Attributes[0].InnerText, out WebActive))
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Failed to read WebPort active attribute");
                }
                if (!bool.TryParse(settings.SelectSingleNode("Config/GeneralSettings/DesktopPort").Attributes[0].InnerText, out DesktopActive))
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Failed to read WebPort active attribute");
                }
            }
            catch
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Failed to read active states");
            }
            string sslPath = settings.SelectSingleNode("Config/GeneralSettings/PfxCertificate").InnerText;
            if (sslPath != "")
            {
                try
                {
                    X509 = new X509Certificate2(sslPath, settings.SelectSingleNode("Config/GeneralSettings/PfxCertificate").Attributes[0].InnerText);
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    Console.WriteLine("Loaded Pfx Certificate, starting ssl");
                }
                catch
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine("Failed to load Pfx Certificate, reverting to non-ssl");
                }
            }
            else
            {
                Console.ForegroundColor = ConsoleColor.Cyan;
                Console.WriteLine("No Pfx Certificate provided, reverting to non-ssl");
            }

            if (Rooms.Count == 0)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("[Server not started] Please add atleast one room to the server or set overrideDefault to false. Press enter to quit.");
                Console.ReadLine();
                return;
            }
            if (!DesktopActive && !WebActive)
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("[Server not started] Please set atleast one server to active (Web or Desktop). Press enter to quit.");
                Console.ReadLine();
                return;
            }
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("Complete!");
            #endregion

            Bots    = new List <dynamic>();
            handler = new BotHandler();
            handler.OnReqestClients += () => { return(clients); };
            handler.OnUpdateClient  += (c) => { clients[c.GUID] = c; };
            handler.OnUpdateRoom    += (r) => { Rooms[r.GUID] = r; };

            startup = DateTime.UtcNow;

            #region Bot Loader
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("Loading Bots...");
            foreach (string dll in Directory.GetDirectories(@"Bots"))
            {
                string path = Directory.GetParent(dll).FullName;
                path = path + @"\" + new DirectoryInfo(dll).Name + @"\" + new DirectoryInfo(dll).Name + ".dll";
                if (!File.Exists(path))
                {
                    continue;
                }

                if (!File.Exists(path.Replace(".dll", ".pdb")))
                {
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine("No .pdb file found for \n" + path);
                    Console.WriteLine("Exact location of error is impossible to determine");
                    Console.ForegroundColor = ConsoleColor.White;
                }
                Assembly DLL   = Assembly.LoadFrom(path);
                Type[]   types = DLL.GetExportedTypes();
                foreach (Type type in types)
                {
                    Bot bot = (Bot)Attribute.GetCustomAttribute(type, typeof(Bot));
                    if (bot != null)
                    {
                        Console.ForegroundColor = ConsoleColor.Blue;
                        Console.WriteLine($"{bot.Name} By {bot.Creator}");
                        Console.ForegroundColor = ConsoleColor.Gray;
                        Console.WriteLine(bot.Desc);
                        Console.ForegroundColor = ConsoleColor.Blue;
                        Console.WriteLine($"Version: {bot.Version}");
                        Console.ForegroundColor = ConsoleColor.White;
                        dynamic c = Activator.CreateInstance(type);
                        try
                        {
                            try
                            {
                                c.Init(handler);
                                Bots.Add(c);
                            }
                            catch (RuntimeBinderException e)
                            {
                                Console.ForegroundColor = ConsoleColor.DarkRed;
                                Console.WriteLine("Failed to load " + path);
                                Console.WriteLine("(" + e.Message + ") thrown in " + e.TargetSite.Name + " at line " + GetLineNumber(e));
                                Console.ForegroundColor = ConsoleColor.White;
                                continue;
                            }
                            catch (Exception e)
                            {
                                Console.ForegroundColor = ConsoleColor.DarkRed;
                                Console.WriteLine("Failed to load " + path);
                                Console.WriteLine("(" + e.Message + ") thrown in " + e.TargetSite.Name + " at line " + GetLineNumber(e));
                                Console.ForegroundColor = ConsoleColor.White;
                                continue;
                            }
                            Console.ForegroundColor = ConsoleColor.Green;
                            Console.WriteLine("Sucessfully loaded!");
                            Console.ForegroundColor = ConsoleColor.White;
                        }
                        catch (Exception e)
                        {
                            Console.ForegroundColor = ConsoleColor.DarkRed;
                            Console.WriteLine("Failed to load " + path);
                            Console.WriteLine("Method Init Missing or Incorrect or other error has occured");
                            Console.WriteLine("(" + e.Message + ") thrown in " + e.TargetSite.Name + " at line " + GetLineNumber(e));
                            Console.ForegroundColor = ConsoleColor.White;
                            continue;
                        }
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.DarkMagenta;
                        Console.WriteLine("Failed to load " + path);
                        Console.WriteLine("File doesnt contain Bot Attribute/Code");
                        Console.ForegroundColor = ConsoleColor.White;
                    }
                }
            }
            Console.ForegroundColor = ConsoleColor.Cyan;
            Console.WriteLine("Complete!");
            Console.ForegroundColor = ConsoleColor.White;
            #endregion

            ListenerState WebState     = ListenerState.Waiting;
            ListenerState DesktopState = ListenerState.Waiting;

            web = new Thread(() => WebListener(ref WebState))
            {
                IsBackground = true
            };

            desktop = new Thread(() => ClientListener(ref DesktopState))
            {
                IsBackground = true
            };

            if (WebActive)
            {
                web.Start();
            }

            if (DesktopActive)
            {
                desktop.Start();
            }

            string json = Rooms.SerializeRooms();
            Rooms = json.DeserializeRooms();

            Console.WriteLine("Type quit to stop server or help for a list of commands");
            while (true)
            {
                string[] command = Console.ReadLine().Split(' ');
                if (command[0] == "quit")
                {
                    break;
                }
                else if (command[0] == "log")
                {
                    if (command[1] == "users")
                    {
                        Console.WriteLine("Users:");
                        foreach (KeyValuePair <string, ClientInfo> client in clients)
                        {
                            Console.WriteLine(client.ToString());
                        }
                    }
                    else if (command[1] == "threads")
                    {
                        Console.WriteLine("Web: ");
                        Console.WriteLine("State -> " + WebState.ToString());
                        Console.WriteLine("Status -> " + web.ThreadState.ToString());

                        Console.WriteLine("Desktop: ");
                        Console.WriteLine("State -> " + DesktopState.ToString());
                        Console.WriteLine("Status -> " + desktop.ThreadState.ToString());
                    }

                    if (command[1] == "rooms")
                    {
                        Console.WriteLine("Rooms:");
                        foreach (KeyValuePair <string, Room> room in Rooms)
                        {
                            Console.WriteLine(room.Value.ToString());
                        }
                    }
                }
                else if (command[0] == "restart")
                {
                    if (command[1] == "web")
                    {
                        WebState = ListenerState.Quiting;
                        while (web.IsAlive)
                        {
                            ;
                        }

                        WebState = ListenerState.Waiting;
                        web      = new Thread(() => WebListener(ref WebState))
                        {
                            IsBackground = true
                        };
                        web.Start();
                        Console.WriteLine("Web Restarted");
                    }
                    else if (command[1] == "desktop")
                    {
                        DesktopState = ListenerState.Quiting;
                        while (desktop.IsAlive)
                        {
                            ;
                        }

                        DesktopState = ListenerState.Waiting;
                        desktop      = new Thread(() => ClientListener(ref DesktopState))
                        {
                            IsBackground = true
                        };
                        desktop.Start();
                        Console.WriteLine("Desktop Restarted");
                    }
                    else if (command[1] == "both")
                    {
                        WebState = ListenerState.Quiting;
                        while (web.IsAlive)
                        {
                            ;
                        }

                        WebState = ListenerState.Waiting;
                        web      = new Thread(() => WebListener(ref WebState))
                        {
                            IsBackground = true
                        };
                        web.Start();
                        Console.WriteLine("Web Restarted");

                        DesktopState = ListenerState.Quiting;
                        while (desktop.IsAlive)
                        {
                            ;
                        }

                        DesktopState = ListenerState.Waiting;
                        desktop      = new Thread(() => ClientListener(ref DesktopState))
                        {
                            IsBackground = true
                        };
                        desktop.Start();
                        Console.WriteLine("Desktop Restarted");
                    }
                }
                else if (command[0] == "help")
                {
                    Console.WriteLine("Coming soon");
                }
            }
        }
예제 #27
0
        public void LoopListening(ref bool StopListenToken)
        {
            // Get Room ID.
            var txt  = HttpRequests.DownloadString(@"https://api.live.bilibili.com/room/v1/Room/room_init?id=" + LiveRoomID).Result;
            var jobj = JToken.Parse(txt);
            var id   = jobj["data"]["room_id"].ToObject <int>();

            // Get Room token.
            txt  = HttpRequests.DownloadString(@"https://api.live.bilibili.com/room/v1/Danmu/getConf?room_id=" + LiveRoomID).Result;
            jobj = JToken.Parse(txt);
            var token = jobj["data"]["token"].ToString();

            using (var ws = new WebSocketSharp.WebSocket("wss://broadcastlv.chat.bilibili.com/sub"))
            {
                State = ListenerState.Connecting;
                ws.Connect();

                // Initialize
                var package = PackageBuilder.MakeAuthPackage(0, id, token);
                Trace.TraceWarning($"BilibiliListener: Connecting:{id}...");
                ws.OnMessage += Ws_OnMessage;
                var bytes = package.ToByteArray();
                ws.Send(bytes);

                // When the connection is not bad, default action.
                // Reconnect to the live room and resend the auto package.
                OnBadCommunication += c =>
                {
                    c.Close();
                    Thread.Sleep(1000);
                    c.Connect();
                    var counter = 3;
                    while (counter-- > 0)
                    {
                        if (c.ReadyState == WebSocketSharp.WebSocketState.Open)
                        {
                            var p = PackageBuilder.MakeAuthPackage(0, id, token);
                            c.Send(p.ToByteArray());
                            LastSendHeartBeatTime = DateTime.Now;
                            State = ListenerState.Connected;
                            Trace.TraceWarning("BilibiliListener: Reconnected.");
                            return;
                        }
                        else
                        {
                            Trace.TraceWarning("BilibiliListener: Retry after 3 seconds.");
                            Thread.Sleep(3000);
                        }
                    }
                };

                // Main loop
                while (!StopListenToken)
                {
                    Thread.Sleep(1000);
                    if (ws.ReadyState == WebSocketSharp.WebSocketState.Open && DateTime.Now.Subtract(LastSendHeartBeatTime).TotalMilliseconds >= HeartBeatDuration)
                    {
                        var heartbeat = PackageBuilder.MakeHeatBeat();
                        ws.Send(heartbeat.ToByteArray());
                        LastSendHeartBeatTime = DateTime.Now;
                        waitBack = true;
                    }
                    if (waitBack && DateTime.Now.Subtract(LastSendHeartBeatTime).TotalMilliseconds >= HeartBeatTimeout)
                    {
                        State = ListenerState.BadCommunication;
                        Trace.TraceWarning("BilibiliListener: Bad communication, retrying.");
                        OnBadCommunication?.Invoke(ws);
                    }
                }

                ws.Close();
                State = ListenerState.Disconnected;
            }
        }
예제 #28
0
        private void ChangeState(ListenerState newState)
        {
            // Check that only allowed state changes are made
            switch (State)
            {
            case ListenerState.uninitialized:
                if (!(newState == ListenerState.initializing || newState == ListenerState.faulted))
                {
                    throw new Exception("Invalid state change. Uninitialized->" + newState.ToString());
                }
                break;

            case ListenerState.initializing:
                if (!(newState == ListenerState.initialized || newState == ListenerState.faulted))
                {
                    throw new Exception("Invalid state change. Initializing->" + newState.ToString());
                }
                break;

            case ListenerState.initialized:
                if (!(newState == ListenerState.starting || newState == ListenerState.faulted))
                {
                    throw new Exception("Invalid state change. Initialized->" + newState.ToString());
                }
                break;

            case ListenerState.starting:
                if (!(newState == ListenerState.started || newState == ListenerState.stopping || newState == ListenerState.faulted))
                {
                    throw new Exception("Invalid state change. Starting->" + newState.ToString());
                }
                break;

            case ListenerState.started:
                if (!(newState == ListenerState.stopping || newState == ListenerState.faulted || newState == ListenerState.starting))
                {
                    throw new Exception("Invalid state change. Started->" + newState.ToString());
                }
                break;

            case ListenerState.stopping:
                if (!(newState == ListenerState.stopped || newState == ListenerState.faulted))
                {
                    throw new Exception("Invalid state change. Stopping->" + newState.ToString());
                }
                break;

            case ListenerState.stopped:
                if (!(newState == ListenerState.faulted))
                {
                    throw new Exception("Invalid state change. Stopped->" + newState.ToString());
                }
                break;

            default:
                throw new Exception("Invalid state change");
            }

            // Raise event
            switch (newState)
            {
            case ListenerState.initializing:
                if (OnInitializing != null)
                {
                    OnInitializing.Invoke();
                }
                break;

            case ListenerState.initialized:
                if (OnInitialized != null)
                {
                    OnInitialized.Invoke();
                }
                break;

            case ListenerState.starting:
                if (OnStarting != null)
                {
                    OnStarting.Invoke();
                }
                break;

            case ListenerState.started:
                if (OnStarted != null)
                {
                    OnStarted.Invoke();
                }
                break;

            case ListenerState.stopping:
                if (OnStopping != null)
                {
                    OnStopping.Invoke();
                }
                break;

            case ListenerState.stopped:
                if (OnStopped != null)
                {
                    OnStopped.Invoke();
                }
                break;

            case ListenerState.faulted:
                if (OnFaulted != null)
                {
                    OnFaulted.Invoke();
                }
                break;
            }

            State = newState;
        }
 public bool SpinWaitForState(ListenerState desired, Func<ListenerState, bool> action)
 {
     return _state.TrySpinWaitForState(desired, action);
 }
예제 #30
0
 // Use this for initialization
 public void StartListening()
 {
     listenerStatus = ListenerState.LISTENING;
     InvokeRepeating("pollPayPalShowPaymentAPI", 0f, listeningInterval);
 }
예제 #31
0
        static void WebListener(ref ListenerState state)
        {
            TcpListener server = new TcpListener(iPAddress, WebPort);

            server.Start();
            while (true)
            {
                state = ListenerState.Waiting;
                TcpClient client = server.AcceptTcpClient();
                state = ListenerState.Accepting;

                //SslStream stream = new SslStream(client.GetStream(), true);
                //stream.AuthenticateAsServer(X509, false, SslProtocols.Default, true);

                while (client.Available < 3)
                {
                    if (state == ListenerState.Quiting)
                    {
                        break;
                    }
                }
                if (state == ListenerState.Quiting)
                {
                    server.Stop();
                    break;
                }
                state = ListenerState.Handshaking;

                //JsonMessageHelpers.HandleHandshake(client.GetStream(), client.Available);
                NetworkStream stream = client.GetStream();
                JsonMessageHelpers.HandleHandshake(stream);

                state = ListenerState.UsernameSub;
                while (client.Available < 3)
                {
                    if (state == ListenerState.Quiting)
                    {
                        break;
                    }
                }
                if (state == ListenerState.Quiting)
                {
                    server.Stop();
                    break;
                }

                JsonMessage json = JsonMessageHelpers.GetJsonMessage(stream);

                if (json.MessageType == MessageType.Initionalize && clients.Any(x => x.Value.Name == json.Name) == false)
                {
                    ClientInfo c = new ClientInfo(json.Name, stream, ClientType.Web);
                    clients.Add(c.GUID, c);
                    ThreadPool.QueueUserWorkItem(HandleClientWebWorker, new object[2] {
                        client, c
                    });
                    state = ListenerState.Connected;
                }
                else
                {
                    JsonMessage h = new JsonMessage(json.Name, MessageType.Status);
                    h.SetStatusType(StatusType.ErrorDisconnect);
                    h.SetContent("User with the name " + json.Name + " already exsists");
                    JsonMessageHelpers.SetJsonMessage(stream, h);
                    stream.Close();
                    stream.Dispose();
                    client.Close();
                    client.Dispose();
                    state = ListenerState.Disconnected;
                }
            }
        }
예제 #32
0
파일: Program.cs 프로젝트: Jereq/OC-FTP
        private static void HandleCommand(DriverState state)
        {
            var parts = Encoding.ASCII.GetString(state.receiveBuffer, 0, state.receivedBytes).Split(' ');

            var cmd = parts[0];

            if (cmd == "LISTEN")
            {
                Console.WriteLine("Creating listening port " + parts[1]);

                var port = int.Parse(parts[1]);
                var newListeningPort = new TcpListener(IPAddress.Any, port);
                newListeningPort.Start();

                var acceptState = new ListenerState { listener = newListeningPort, driver = state, port = port };
                state.listeningPorts.Add(acceptState.port, acceptState);

                StartReceiveCommand(state);
            }
            else if (cmd == "STOP_LISTEN")
            {
                Console.WriteLine("Stopping listening port " + parts[1]);

                var port = int.Parse(parts[1]);
                var listenerState = state.listeningPorts[port];
                listenerState.listener.Stop();
                state.listeningPorts.Remove(port);

                StartReceiveCommand(state);
            }
            else if (cmd == "CLOSE_CONNECTION")
            {
                Console.WriteLine("Closing connection " + parts[1]);

                var connectionId = int.Parse(parts[1]);
                var connectionState = state.connections[connectionId];
                connectionState.socket.Shutdown(SocketShutdown.Both);
                connectionState.socket.Close();
                state.connections.Remove(connectionId);

                StartReceiveCommand(state);
            }
            else if (cmd == "ACCEPT_ONE")
            {
                Console.WriteLine("Accepting one connection on port " + parts[1]);

                var port = int.Parse(parts[1]);
                var listenerState = state.listeningPorts[port];
                listenerState.listener.BeginAcceptSocket(new AsyncCallback(OnAcceptSocketOnce), listenerState);

                StartReceiveCommand(state);
            }
            else if (cmd == "ACCEPT_ALL")
            {
                Console.WriteLine("Accepting all connections on port " + parts[1]);

                var port = int.Parse(parts[1]);
                var listenerState = state.listeningPorts[port];
                listenerState.listener.BeginAcceptSocket(new AsyncCallback(OnAcceptSocket), listenerState);

                StartReceiveCommand(state);
            }
            else if (cmd == "SEND")
            {
                Console.WriteLine("Sending " + parts[2] + " bytes to " + parts[1]);

                var connectionId = int.Parse(parts[1]);
                var messageLength = int.Parse(parts[2]);
                var payloadState = new SendPayloadState
                {
                    bytesToReceive = messageLength,
                    target = state.connections[connectionId]
                };
                state.socket.BeginReceive(state.receiveBuffer, 0, Math.Min(payloadState.bytesToReceive, state.receiveBuffer.Length),
                    SocketFlags.None, new AsyncCallback(OnPayloadReceived), payloadState);
            }
            else if (cmd == "READ_ONCE")
            {
                Console.WriteLine("Reading once (max " + parts[2] + " bytes) from " + parts[1]);

                var connectionId = int.Parse(parts[1]);
                var maxBytes = int.Parse(parts[2]);
                var connectionState = state.connections[connectionId];
                if (maxBytes == 0)
                {
                    maxBytes = connectionState.receiveBuffer.Length;
                }
                connectionState.socket.BeginReceive(connectionState.receiveBuffer, 0, maxBytes, SocketFlags.None, new AsyncCallback(OnReceiveClientDataOnce), connectionState);

                StartReceiveCommand(state);
            }
            else if (cmd == "READ_ALL")
            {
                Console.WriteLine("Reading all from " + parts[1]);

                var connectionId = int.Parse(parts[1]);
                var connectionState = state.connections[connectionId];
                connectionState.socket.BeginReceive(connectionState.receiveBuffer, 0, connectionState.receiveBuffer.Length, SocketFlags.None, new AsyncCallback(OnReceiveClientData), connectionState);

                StartReceiveCommand(state);
            }
            else
            {
                Console.WriteLine("Unknown command: " + string.Join(" ", parts));
            }
        }
예제 #33
0
        private void OnReceive(IAsyncResult ar)
        {
            try
            {
                if (_listeningSocket != null)
                {
                    EndPoint remoteEndpoint = new IPEndPoint(IPAddress.Any, Constants.MulticastPort);
                    var bytesReceived = _listeningSocket.EndReceiveFrom(ar, ref remoteEndpoint);
                    var listenerState = (ListenerState)ar.AsyncState;
                    var requestString = Encoding.ASCII.GetString(listenerState.Buffer, 0, bytesReceived);
                    var message = _messageParser.Parse(requestString);

                    if (message.MessageLine.StartsWith(Constants.NotifyMessage))
                    {
                        Task.Run(() =>
                        {
                            var dev = _deviceInfoCollector.Collect(message);
                            DeviceDiscovered?.Invoke(this, dev);
                        });

                    }
                    else if (message.MessageLine.StartsWith(Constants.SearchMessage))
                    {
                        SearchMessageReceived?.Invoke(this, message);

                        var responseString = _responseFactory.CreateResponse(requestString);

                        if (responseString != null)
                        {
                            var responseBuffer = Encoding.ASCII.GetBytes(responseString);
                            _listeningSocket.SendTo(responseBuffer, remoteEndpoint);
                        }
                    }

                    // enter new listening loop
                    listenerState = new ListenerState();
                    _listeningSocket.BeginReceiveFrom(listenerState.Buffer,
                        ref remoteEndpoint, OnReceive, listenerState);
                }
            }
            catch (ObjectDisposedException)
            {

            }
            catch (Exception e)
            {
                _log.Error(e);

                if (_started && !_stopped)
                {
                    // stop and start listening again because there was an error
                    Stop();
                    Listen();
                }
            }
        }
예제 #34
0
 public void ChangeState(ListenerState state)
 {
 }