瀏覽代碼

fix socket errors on linux under .net core

Luke Pulverenti 8 年之前
父節點
當前提交
524e7facc8

+ 6 - 6
Emby.Common.Implementations/Net/SocketFactory.cs

@@ -125,15 +125,15 @@ namespace Emby.Common.Implementations.Net
 
             try
             {
-#if NETSTANDARD1_3
-				// The ExclusiveAddressUse socket option is a Windows-specific option that, when set to "true," tells Windows not to allow another socket to use the same local address as this socket
-				// See https://github.com/dotnet/corefx/pull/11509 for more details
-				if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows))
+#if NET46
+				retVal.ExclusiveAddressUse = false;
+#else
+                // The ExclusiveAddressUse socket option is a Windows-specific option that, when set to "true," tells Windows not to allow another socket to use the same local address as this socket
+                // See https://github.com/dotnet/corefx/pull/11509 for more details
+                if (System.Runtime.InteropServices.RuntimeInformation.IsOSPlatform(System.Runtime.InteropServices.OSPlatform.Windows))
 				{
 					retVal.ExclusiveAddressUse = false;
 				}
-#else
-                retVal.ExclusiveAddressUse = false;
 #endif
                 //retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, true);
                 retVal.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

+ 1 - 1
Emby.Common.Implementations/Networking/NetworkManager.cs

@@ -245,7 +245,7 @@ namespace Emby.Common.Implementations.Networking
                     //}
 
                     return ipProperties.UnicastAddresses
-                        .Where(i => i.IsDnsEligible)
+                        //.Where(i => i.IsDnsEligible)
                         .Select(i => i.Address)
                         .Where(i => i.AddressFamily == AddressFamily.InterNetwork)
                         .ToList();

+ 2 - 10
Emby.Server.Implementations/HttpServer/SocketSharp/SharpWebSocket.cs

@@ -102,11 +102,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
         /// <returns>Task.</returns>
         public Task SendAsync(byte[] bytes, bool endOfMessage, CancellationToken cancellationToken)
         {
-            var completionSource = new TaskCompletionSource<bool>();
-
-            WebSocket.SendAsync(bytes, res => completionSource.TrySetResult(true));
-
-            return completionSource.Task;
+            return WebSocket.SendAsync(bytes);
         }
 
         /// <summary>
@@ -118,11 +114,7 @@ namespace Emby.Server.Implementations.HttpServer.SocketSharp
         /// <returns>Task.</returns>
         public Task SendAsync(string text, bool endOfMessage, CancellationToken cancellationToken)
         {
-            var completionSource = new TaskCompletionSource<bool>();
-
-            WebSocket.SendAsync(text, res => completionSource.TrySetResult(true));
-
-            return completionSource.Task;
+            return WebSocket.SendAsync(text);
         }
 
         /// <summary>

+ 2 - 1
MediaBrowser.Api/BaseApiService.cs

@@ -151,9 +151,10 @@ namespace MediaBrowser.Api
             }
 
             if (client.IndexOf("web", StringComparison.OrdinalIgnoreCase) == -1 &&
+
+                // covers both emby mobile and emby for android mobile
                 client.IndexOf("mobile", StringComparison.OrdinalIgnoreCase) == -1 &&
                 client.IndexOf("ios", StringComparison.OrdinalIgnoreCase) == -1 &&
-                client.IndexOf("android", StringComparison.OrdinalIgnoreCase) == -1 &&
                 client.IndexOf("theater", StringComparison.OrdinalIgnoreCase) == -1)
             {
                 options.Fields.Add(Model.Querying.ItemFields.ChildCount);

+ 22 - 33
SocketHttpListener.Portable/WebSocket.cs

@@ -5,6 +5,7 @@ using System.IO;
 using System.Net;
 using System.Text;
 using System.Threading;
+using System.Threading.Tasks;
 using MediaBrowser.Model.Cryptography;
 using MediaBrowser.Model.IO;
 using SocketHttpListener.Net.WebSockets;
@@ -621,26 +622,22 @@ namespace SocketHttpListener
             }
         }
 
-        private void sendAsync(Opcode opcode, Stream stream, Action<bool> completed)
+        private Task sendAsync(Opcode opcode, Stream stream)
         {
-            Func<Opcode, Stream, bool> sender = send;
-            sender.BeginInvoke(
-              opcode,
-              stream,
-              ar =>
-              {
-                  try
-                  {
-                      var sent = sender.EndInvoke(ar);
-                      if (completed != null)
-                          completed(sent);
-                  }
-                  catch (Exception ex)
-                  {
-                      error("An exception has occurred while callback.", ex);
-                  }
-              },
-              null);
+            var completionSource = new TaskCompletionSource<bool>();
+            Task.Run(() =>
+           {
+               try
+               {
+                   send(opcode, stream);
+                   completionSource.TrySetResult(true);
+               }
+               catch (Exception ex)
+               {
+                   completionSource.TrySetException(ex);
+               }
+           });
+            return completionSource.Task;
         }
 
         // As server
@@ -833,22 +830,18 @@ namespace SocketHttpListener
         /// <param name="data">
         /// An array of <see cref="byte"/> that represents the binary data to send.
         /// </param>
-        /// <param name="completed">
         /// An Action&lt;bool&gt; delegate that references the method(s) called when the send is
         /// complete. A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is
         /// complete successfully; otherwise, <c>false</c>.
-        /// </param>
-        public void SendAsync(byte[] data, Action<bool> completed)
+        public Task SendAsync(byte[] data)
         {
             var msg = _readyState.CheckIfOpen() ?? data.CheckIfValidSendData();
             if (msg != null)
             {
-                error(msg);
-
-                return;
+                throw new Exception(msg);
             }
 
-            sendAsync(Opcode.Binary, _memoryStreamFactory.CreateNew(data), completed);
+            return sendAsync(Opcode.Binary, _memoryStreamFactory.CreateNew(data));
         }
 
         /// <summary>
@@ -860,22 +853,18 @@ namespace SocketHttpListener
         /// <param name="data">
         /// A <see cref="string"/> that represents the text data to send.
         /// </param>
-        /// <param name="completed">
         /// An Action&lt;bool&gt; delegate that references the method(s) called when the send is
         /// complete. A <see cref="bool"/> passed to this delegate is <c>true</c> if the send is
         /// complete successfully; otherwise, <c>false</c>.
-        /// </param>
-        public void SendAsync(string data, Action<bool> completed)
+        public Task SendAsync(string data)
         {
             var msg = _readyState.CheckIfOpen() ?? data.CheckIfValidSendData();
             if (msg != null)
             {
-                error(msg);
-
-                return;
+                throw new Exception(msg);
             }
 
-            sendAsync(Opcode.Text, _memoryStreamFactory.CreateNew(Encoding.UTF8.GetBytes(data)), completed);
+            return sendAsync(Opcode.Text, _memoryStreamFactory.CreateNew(Encoding.UTF8.GetBytes(data)));
         }
 
         #endregion

+ 6 - 3
src/Emby.Server/Program.cs

@@ -215,9 +215,12 @@ namespace Emby.Server
 
             var initProgress = new Progress<double>();
 
-            // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes
-            SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT |
-                         ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);
+            if (environmentInfo.OperatingSystem == MediaBrowser.Model.System.OperatingSystem.Windows)
+            {
+                // Not crazy about this but it's the only way to suppress ffmpeg crash dialog boxes
+                SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS | ErrorModes.SEM_NOALIGNMENTFAULTEXCEPT |
+                             ErrorModes.SEM_NOGPFAULTERRORBOX | ErrorModes.SEM_NOOPENFILEERRORBOX);
+            }
 
             var task = _appHost.Init(initProgress);
             Task.WaitAll(task);