diff --git a/src/MTProto/Proxy/SocketSelectReceiverThread.cs b/src/MTProto/Proxy/SocketSelectReceiverThread.cs index 615d27f..35e2015 100644 --- a/src/MTProto/Proxy/SocketSelectReceiverThread.cs +++ b/src/MTProto/Proxy/SocketSelectReceiverThread.cs @@ -33,6 +33,7 @@ public void AddConnection(ProxyConnection connection) Start(); } } + connection.Socket.ReceiveTimeout = 30000; } public void RemoveConnection(ProxyConnection connection) { @@ -147,6 +148,10 @@ private void ThreadLoop(object threadObj) { SocketConnections[skt].Close(); } + if (ToRead.Count + ToError.Count != 0) + { + Waiter.SleepMicro(Timeout); + } } } } diff --git a/src/MTProto/Proxy/SocketServer.cs b/src/MTProto/Proxy/SocketServer.cs index 8a97248..f00a86a 100644 --- a/src/MTProto/Proxy/SocketServer.cs +++ b/src/MTProto/Proxy/SocketServer.cs @@ -54,7 +54,9 @@ public void Stop() { return; } + ServerSocket.Shutdown(SocketShutdown.Both); ServerSocket.Close(); + using (ServerSocket) ; ServerSocket = null; Works = false; } diff --git a/src/MTProto/Waiter.cs b/src/MTProto/Waiter.cs new file mode 100644 index 0000000..f7e2b40 --- /dev/null +++ b/src/MTProto/Waiter.cs @@ -0,0 +1,13 @@ +using System.Net.Sockets; + +namespace MTProto +{ + public class Waiter + { + private static readonly Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + public static void SleepMicro(int microseconds) + { + skt.Poll(microseconds, SelectMode.SelectRead); + } + } +} diff --git a/src/tgsocks/Program.cs b/src/tgsocks/Program.cs index 6c499a4..0567953 100644 --- a/src/tgsocks/Program.cs +++ b/src/tgsocks/Program.cs @@ -63,6 +63,11 @@ static void Main(string[] args) proxyManager.Connections.OnConnectionRemoved += Connections_OnConnectionRemoved; Log("OK, Load config complete, starting"); + Console.CancelKeyPress += (a, b) => { + Log("Stopping..."); + proxyManager.Stop(); + Log("Stopped"); + }; proxyManager.Start(); Log("Server started"); System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);