mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-01-15 23:58:57 +00:00
Replace ISocket and UdpSocket, fix DLNA and SSDP binding and discovery
This commit is contained in:
75
MediaBrowser.Model/Net/IPData.cs
Normal file
75
MediaBrowser.Model/Net/IPData.cs
Normal file
@@ -0,0 +1,75 @@
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
|
||||
namespace MediaBrowser.Model.Net
|
||||
{
|
||||
/// <summary>
|
||||
/// Base network object class.
|
||||
/// </summary>
|
||||
public class IPData
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="IPData"/> class.
|
||||
/// </summary>
|
||||
/// <param name="address">The <see cref="IPAddress"/>.</param>
|
||||
/// <param name="subnet">The <see cref="IPNetwork"/>.</param>
|
||||
/// <param name="name">The interface name.</param>
|
||||
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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="IPData"/> class.
|
||||
/// </summary>
|
||||
/// <param name="address">The <see cref="IPAddress"/>.</param>
|
||||
/// <param name="subnet">The <see cref="IPNetwork"/>.</param>
|
||||
public IPData(IPAddress address, IPNetwork? subnet)
|
||||
: this(address, subnet, string.Empty)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the object's IP address.
|
||||
/// </summary>
|
||||
public IPAddress Address { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the object's IP address.
|
||||
/// </summary>
|
||||
public IPNetwork Subnet { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the interface index.
|
||||
/// </summary>
|
||||
public int Index { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the interface name.
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the AddressFamily of the object.
|
||||
/// </summary>
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,34 +0,0 @@
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System;
|
||||
using System.Net;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace MediaBrowser.Model.Net
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides a common interface across platforms for UDP sockets used by this SSDP implementation.
|
||||
/// </summary>
|
||||
public interface ISocket : IDisposable
|
||||
{
|
||||
IPAddress LocalIPAddress { get; }
|
||||
|
||||
Task<SocketReceiveResult> ReceiveAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken);
|
||||
|
||||
IAsyncResult BeginReceive(byte[] buffer, int offset, int count, AsyncCallback callback);
|
||||
|
||||
SocketReceiveResult EndReceive(IAsyncResult result);
|
||||
|
||||
/// <summary>
|
||||
/// Sends a UDP message to a particular end point (uni or multicast).
|
||||
/// </summary>
|
||||
/// <param name="buffer">An array of type <see cref="byte" /> that contains the data to send.</param>
|
||||
/// <param name="offset">The zero-based position in buffer at which to begin sending data.</param>
|
||||
/// <param name="bytes">The number of bytes to send.</param>
|
||||
/// <param name="endPoint">An <see cref="IPEndPoint" /> that represents the remote device.</param>
|
||||
/// <param name="cancellationToken">The cancellation token to cancel operation.</param>
|
||||
/// <returns>The task object representing the asynchronous operation.</returns>
|
||||
Task SendToAsync(byte[] buffer, int offset, int bytes, IPEndPoint endPoint, CancellationToken cancellationToken);
|
||||
}
|
||||
}
|
||||
@@ -1,32 +1,36 @@
|
||||
#pragma warning disable CS1591
|
||||
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
|
||||
namespace MediaBrowser.Model.Net
|
||||
{
|
||||
/// <summary>
|
||||
/// Implemented by components that can create a platform specific UDP socket implementation, and wrap it in the cross platform <see cref="ISocket"/> interface.
|
||||
/// Implemented by components that can create specific socket configurations.
|
||||
/// </summary>
|
||||
public interface ISocketFactory
|
||||
{
|
||||
ISocket CreateUdpBroadcastSocket(int localPort);
|
||||
/// <summary>
|
||||
/// Creates a new unicast socket using the specified local port number.
|
||||
/// </summary>
|
||||
/// <param name="localPort">The local port to bind to.</param>
|
||||
/// <returns>A new unicast socket using the specified local port number.</returns>
|
||||
Socket CreateUdpBroadcastSocket(int localPort);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new unicast socket using the specified local port number.
|
||||
/// </summary>
|
||||
/// <param name="localIp">The local IP address to bind to.</param>
|
||||
/// <param name="bindInterface">The bind interface.</param>
|
||||
/// <param name="localPort">The local port to bind to.</param>
|
||||
/// <returns>A new unicast socket using the specified local port number.</returns>
|
||||
ISocket CreateSsdpUdpSocket(IPAddress localIp, int localPort);
|
||||
Socket CreateSsdpUdpSocket(IPData bindInterface, int localPort);
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new multicast socket using the specified multicast IP address, multicast time to live and local port.
|
||||
/// </summary>
|
||||
/// <param name="ipAddress">The multicast IP address to bind to.</param>
|
||||
/// <param name="bindIpAddress">The bind IP address.</param>
|
||||
/// <param name="multicastAddress">The multicast IP address to bind to.</param>
|
||||
/// <param name="bindInterface">The bind interface.</param>
|
||||
/// <param name="multicastTimeToLive">The multicast time to live value. Actually a maximum number of network hops for UDP packets.</param>
|
||||
/// <param name="localPort">The local port to bind to.</param>
|
||||
/// <returns>A <see cref="ISocket"/> implementation.</returns>
|
||||
ISocket CreateUdpMulticastSocket(IPAddress ipAddress, IPAddress bindIpAddress, int multicastTimeToLive, int localPort);
|
||||
/// <returns>A new multicast socket using the specfied bind interface, multicast address, multicast time to live and port.</returns>
|
||||
Socket CreateUdpMulticastSocket(IPAddress multicastAddress, IPData bindInterface, int multicastTimeToLive, int localPort);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user