Explorar o código

Sending multicasts out of Sockets without setting the broadcast to true - causes the error "Bad value for ai_flags" on some systems (#3404)

The underlying cause looks to be https://github.com/dotnet/runtime/issues/28630.

Basically, it's an access denied bug.
It looks like multicasts need the same access rights as broadcasts on some systems.
BaronGreenback %!s(int64=5) %!d(string=hai) anos
pai
achega
f01baad05e

+ 1 - 1
Emby.Server.Implementations/Net/SocketFactory.cs

@@ -4,7 +4,6 @@ using System;
 using System.Net;
 using System.Net;
 using System.Net.Sockets;
 using System.Net.Sockets;
 using MediaBrowser.Model.Net;
 using MediaBrowser.Model.Net;
-using Microsoft.Extensions.Logging;
 
 
 namespace Emby.Server.Implementations.Net
 namespace Emby.Server.Implementations.Net
 {
 {
@@ -123,6 +122,7 @@ namespace Emby.Server.Implementations.Net
 
 
                 retVal.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse(ipAddress), localIp));
                 retVal.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse(ipAddress), localIp));
                 retVal.MulticastLoopback = true;
                 retVal.MulticastLoopback = true;
+
                 return new UdpSocket(retVal, localPort, localIp);
                 return new UdpSocket(retVal, localPort, localIp);
             }
             }
             catch
             catch

+ 0 - 2
MediaBrowser.Model/Net/ISocketFactory.cs

@@ -1,7 +1,6 @@
 #pragma warning disable CS1591
 #pragma warning disable CS1591
 
 
 using System.Net;
 using System.Net;
-using Microsoft.Extensions.Logging;
 
 
 namespace MediaBrowser.Model.Net
 namespace MediaBrowser.Model.Net
 {
 {
@@ -25,6 +24,5 @@ namespace MediaBrowser.Model.Net
         /// <param name="localPort">The local port to bind to.</param>
         /// <param name="localPort">The local port to bind to.</param>
         /// <returns>A <see cref="ISocket"/> implementation.</returns>
         /// <returns>A <see cref="ISocket"/> implementation.</returns>
         ISocket CreateUdpMulticastSocket(string ipAddress, int multicastTimeToLive, int localPort);
         ISocket CreateUdpMulticastSocket(string ipAddress, int multicastTimeToLive, int localPort);
-
     }
     }
 }
 }

+ 3 - 2
RSSDP/SsdpCommunicationsServer.cs

@@ -338,7 +338,8 @@ namespace Rssdp.Infrastructure
 
 
         private ISocket ListenForBroadcastsAsync()
         private ISocket ListenForBroadcastsAsync()
         {
         {
-            var socket = _SocketFactory.CreateUdpMulticastSocket(SsdpConstants.MulticastLocalAdminAddress, _MulticastTtl, SsdpConstants.MulticastPort);            
+            var socket = _SocketFactory.CreateUdpMulticastSocket(SsdpConstants.MulticastLocalAdminAddress, _MulticastTtl, SsdpConstants.MulticastPort);
+            
             _ = ListenToSocketInternal(socket);
             _ = ListenToSocketInternal(socket);
 
 
             return socket;
             return socket;
@@ -382,7 +383,7 @@ namespace Rssdp.Infrastructure
         private async Task ListenToSocketInternal(ISocket socket)
         private async Task ListenToSocketInternal(ISocket socket)
         {
         {
             var cancelled = false;
             var cancelled = false;
-            var receiveBuffer = new byte[8192]; 
+            var receiveBuffer = new byte[8192];
 
 
             while (!cancelled && !IsDisposed)
             while (!cancelled && !IsDisposed)
             {
             {