Пример #1
0
        private void Run()
        {
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(new IPEndPoint(IPAddress.Any, port));
            server.Listen(4);

            while (true)
            {
                OnStatusMessageUpdated("Waiting for connection.", StatusMessageEventArgs.MessageType.LogInfo);
                try
                {
                    Socket socket = server.Accept();
                    Console.WriteLine("After accept.");
                    NodeStatus node = nodeManager.getNextNode();
                    string     ip   = ((System.Net.IPEndPoint)socket.RemoteEndPoint).Address.ToString();
                    // HACK
                    if (ip == "202.39.236.116")
                    {
                        // This IP has been bad. Blacklist it until proper filtering is added.
                        OnStatusMessageUpdated("Attempt from blacklisted IP.", StatusMessageEventArgs.MessageType.LogInfo);
                        Thread.Sleep(1000);
                        node = null;
                    }
                    OnStatusMessageUpdated(name + " from " + ip, StatusMessageEventArgs.MessageType.Connect);
                    if (node != null)
                    {
                        node.RemoteAddress = ip;
                        OnStatusMessageUpdated("Launching Node #" + node.Node, StatusMessageEventArgs.MessageType.LogInfo);
                        Thread instanceThread = new Thread(() => LaunchInstance(node, socket));
                        instanceThread.Name = "Instance #" + node.Node;
                        instanceThread.Start();
                        OnNodeUpdated(node);
                    }
                    else
                    {
                        // Send BUSY signal.
                        OnStatusMessageUpdated("Sending Busy Signal.", StatusMessageEventArgs.MessageType.Status);
                        byte[] busy = System.Text.Encoding.ASCII.GetBytes("BUSY");
                        try
                        {
                            socket.Send(busy);
                        }
                        finally
                        {
                            socket.Close();
                        }
                    }
                }
                catch (SocketException e)
                {
                    Console.WriteLine(e.ToString());
                }
            }
        }
Пример #2
0
        private void Run()
        {
            server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            server.Bind(new IPEndPoint(IPAddress.Any, port));
            server.Listen(4);

            while (true)
            {
                Debug.WriteLine("Waiting for connection.");
                string ip = "";
                try
                {
                    Socket socket = server.Accept();
                    ip = ((System.Net.IPEndPoint)socket.RemoteEndPoint).Address.ToString();
                    Debug.WriteLine("After accept from IP: " + ip);
                    OnStatusMessageUpdated(this.name + " from " + ip, StatusMessageEventArgs.MessageType.Connect);

                    if (IncrementConcurrentSession(ip))
                    {
                        SendBusyAndCloseSocket(socket);
                        continue;
                    }

                    if (!CanConnect(socket))
                    {
                        DecrementConnection(ip);
                        continue;
                    }

                    // Grab a node # after we've cleared everything else.
                    NodeStatus node = nodeManager.getNextNode(this.nodeType);
                    if (node == null)
                    {
                        // NO node available.
                        Log("No node available.");
                        SendBusyAndCloseSocket(socket);
                        DecrementConnection(ip);
                        continue;
                    }

                    node.RemoteAddress = ip;
                    Thread        instanceThread = new Thread(() => LaunchInstance(node, socket));
                    StringBuilder n = new StringBuilder();
                    if (node.NodeType == NodeType.BBS)
                    {
                        n.Append("Instance #").Append(node.Node);
                    }
                    else if (node.NodeType == NodeType.BINKP)
                    {
                        n.Append("BinkP");
                    }
                    instanceThread.Name = n.ToString();
                    instanceThread.Start();
                    OnNodeUpdated(node);
                }
                catch (SocketException e)
                {
                    DecrementConnection(ip);
                    DebugLog("Exception" + e.ToString());
                }
                catch (ThreadAbortException)
                {
                    DecrementConnection(ip);
                    Debug.WriteLine("Server Exiting normally...");
                    return;
                }
                catch (Exception e)
                {
                    DecrementConnection(ip);
                    DebugLog("Exception" + e.ToString());
                }
            }
        }