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()); } } }
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()); } } }