From 42498194d9a4069b8cdeb9446f2714f74e3169de Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Thu, 16 Feb 2023 18:15:12 +0100 Subject: Replace ISocket and UdpSocket, fix DLNA and SSDP binding and discovery --- MediaBrowser.Model/Net/IPData.cs | 75 ++++++++++++++++++++++++++++++++ MediaBrowser.Model/Net/ISocket.cs | 34 --------------- MediaBrowser.Model/Net/ISocketFactory.cs | 24 +++++----- 3 files changed, 89 insertions(+), 44 deletions(-) create mode 100644 MediaBrowser.Model/Net/IPData.cs delete mode 100644 MediaBrowser.Model/Net/ISocket.cs (limited to 'MediaBrowser.Model/Net') diff --git a/MediaBrowser.Model/Net/IPData.cs b/MediaBrowser.Model/Net/IPData.cs new file mode 100644 index 0000000000..16d74dcddd --- /dev/null +++ b/MediaBrowser.Model/Net/IPData.cs @@ -0,0 +1,75 @@ +using System.Net; +using System.Net.Sockets; +using Microsoft.AspNetCore.HttpOverrides; + +namespace MediaBrowser.Model.Net +{ + /// + /// Base network object class. + /// + public class IPData + { + /// + /// Initializes a new instance of the class. + /// + /// The . + /// The . + /// The interface name. + public IPData(IPAddress address, IPNetwork? subnet, string name) + { + Address = address; + Subnet = subnet ?? (address.AddressFamily == AddressFamily.InterNetwork ? new IPNetwork(address, 32) : new IPNetwork(address, 128)); + Name = name; + } + + /// + /// Initializes a new instance of the class. + /// + /// The . + /// The . + public IPData(IPAddress address, IPNetwork? subnet) + : this(address, subnet, string.Empty) + { + } + + /// + /// Gets or sets the object's IP address. + /// + public IPAddress Address { get; set; } + + /// + /// Gets or sets the object's IP address. + /// + public IPNetwork Subnet { get; set; } + + /// + /// Gets or sets the interface index. + /// + public int Index { get; set; } + + /// + /// Gets or sets the interface name. + /// + public string Name { get; set; } + + /// + /// Gets the AddressFamily of the object. + /// + public AddressFamily AddressFamily + { + get + { + if (Address.Equals(IPAddress.None)) + { + return Subnet.Prefix.AddressFamily.Equals(IPAddress.None) + ? AddressFamily.Unspecified + : Subnet.Prefix.AddressFamily; + } + else + { + return Address.AddressFamily; + } + } + } + } +} diff --git a/MediaBrowser.Model/Net/ISocket.cs b/MediaBrowser.Model/Net/ISocket.cs deleted file mode 100644 index 3de41d565a..0000000000 --- a/MediaBrowser.Model/Net/ISocket.cs +++ /dev/null @@ -1,34 +0,0 @@ -#pragma warning disable CS1591 - -using System; -using System.Net; -using System.Threading; -using System.Threading.Tasks; - -namespace MediaBrowser.Model.Net -{ - /// - /// Provides a common interface across platforms for UDP sockets used by this SSDP implementation. - /// - public interface ISocket : IDisposable - { - IPAddress LocalIPAddress { get; } - - Task ReceiveAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken); - - IAsyncResult BeginReceive(byte[] buffer, int offset, int count, AsyncCallback callback); - - SocketReceiveResult EndReceive(IAsyncResult result); - - /// - /// Sends a UDP message to a particular end point (uni or multicast). - /// - /// An array of type that contains the data to send. - /// The zero-based position in buffer at which to begin sending data. - /// The number of bytes to send. - /// An that represents the remote device. - /// The cancellation token to cancel operation. - /// The task object representing the asynchronous operation. - Task SendToAsync(byte[] buffer, int offset, int bytes, IPEndPoint endPoint, CancellationToken cancellationToken); - } -} diff --git a/MediaBrowser.Model/Net/ISocketFactory.cs b/MediaBrowser.Model/Net/ISocketFactory.cs index f3bc31796d..49a88c2277 100644 --- a/MediaBrowser.Model/Net/ISocketFactory.cs +++ b/MediaBrowser.Model/Net/ISocketFactory.cs @@ -1,32 +1,36 @@ -#pragma warning disable CS1591 - using System.Net; +using System.Net.Sockets; namespace MediaBrowser.Model.Net { /// - /// Implemented by components that can create a platform specific UDP socket implementation, and wrap it in the cross platform interface. + /// Implemented by components that can create specific socket configurations. /// public interface ISocketFactory { - ISocket CreateUdpBroadcastSocket(int localPort); + /// + /// Creates a new unicast socket using the specified local port number. + /// + /// The local port to bind to. + /// A new unicast socket using the specified local port number. + Socket CreateUdpBroadcastSocket(int localPort); /// /// Creates a new unicast socket using the specified local port number. /// - /// The local IP address to bind to. + /// The bind interface. /// The local port to bind to. /// A new unicast socket using the specified local port number. - ISocket CreateSsdpUdpSocket(IPAddress localIp, int localPort); + Socket CreateSsdpUdpSocket(IPData bindInterface, int localPort); /// /// Creates a new multicast socket using the specified multicast IP address, multicast time to live and local port. /// - /// The multicast IP address to bind to. - /// The bind IP address. + /// The multicast IP address to bind to. + /// The bind interface. /// The multicast time to live value. Actually a maximum number of network hops for UDP packets. /// The local port to bind to. - /// A implementation. - ISocket CreateUdpMulticastSocket(IPAddress ipAddress, IPAddress bindIpAddress, int multicastTimeToLive, int localPort); + /// A new multicast socket using the specfied bind interface, multicast address, multicast time to live and port. + Socket CreateUdpMulticastSocket(IPAddress multicastAddress, IPData bindInterface, int multicastTimeToLive, int localPort); } } -- cgit v1.2.3