public override void Close(string reason) { base.Close(reason); if (m_closePending) { return; } m_closePending = true; // Avoid a loop with FatalLog(reason) try { if (m_socket != null) { if (reason != "Disconnect") { LogFatal(reason); } m_socket.Shutdown(SocketShutdown.Both); m_socket.Close(); } } catch { } ClientDisconnectSignal.Set(); }
public override void MainLoop() { base.MainLoop(); try { int port = Constants.PortSpot; if (m_serviceMode) { port = Constants.PortService; } if (m_cmdline.ContainsKey("port")) { port = Convert.ToInt32(m_cmdline["port"]); } IPAddress ipAddress = IPAddress.Loopback; m_localEndPoint = new IPEndPoint(ipAddress, port); LogDebug("Listen on localhost, port " + port.ToString() + ", " + (m_serviceMode ? "Service mode" : "Spot mode")); Socket listener = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp); listener.Bind(m_localEndPoint); listener.Listen(100); while (true) { m_socket = null; m_sb.Clear(); m_closePending = false; LogDebug("Waiting connection"); ClientDisconnectSignal.Reset(); listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); ClientDisconnectSignal.WaitOne(); if (m_serviceMode == false) { break; } } } catch (Exception ex) { Close(ex.Message); } LogDebug("Clean end"); }