diff --git a/v2rayN/v2rayN/Handler/DownloadHandle.cs b/v2rayN/v2rayN/Handler/DownloadHandle.cs index c2fb9914..5d4d3caf 100644 --- a/v2rayN/v2rayN/Handler/DownloadHandle.cs +++ b/v2rayN/v2rayN/Handler/DownloadHandle.cs @@ -4,6 +4,7 @@ using System.IO; using System.Net; using System.Net.Http; using System.Net.Http.Headers; +using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -66,7 +67,11 @@ namespace v2rayN.Handler catch (Exception ex) { //Utils.SaveLog(ex.Message, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } } return 0; } @@ -104,7 +109,11 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); - Error?.Invoke(this, new ErrorEventArgs(ex)); + Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } } } @@ -167,6 +176,10 @@ namespace v2rayN.Handler { Utils.SaveLog(ex.Message, ex); Error?.Invoke(this, new ErrorEventArgs(ex)); + if (ex.InnerException != null) + { + Error?.Invoke(this, new ErrorEventArgs(ex.InnerException)); + } } return null; } @@ -239,13 +252,35 @@ namespace v2rayN.Handler return null; } var httpPort = LazyConfig.Instance.GetConfig().GetLocalPort(Global.InboundHttp); - var webProxy = new WebProxy(Global.Loopback, httpPort); - if (RunAvailabilityCheck(webProxy) > 0) + if (!SocketCheck(Global.Loopback, httpPort)) { - return webProxy; + return null; } - return null; + return new WebProxy(Global.Loopback, httpPort); + } + + private bool SocketCheck(string ip, int port) + { + Socket sock = null; + try + { + IPAddress ipa = IPAddress.Parse(ip); + IPEndPoint point = new IPEndPoint(ipa, port); + sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + sock.Connect(point); + return true; + } + catch { } + finally + { + if (sock != null) + { + sock.Close(); + sock.Dispose(); + } + } + return false; } } }