aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model/Net
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2016-12-18 00:44:33 -0500
committerGitHub <noreply@github.com>2016-12-18 00:44:33 -0500
commite7cebb91a73354dc3e0d0b6340c9fbd6511f4406 (patch)
tree6f1c368c766c17b7514fe749c0e92e69cd89194a /MediaBrowser.Model/Net
parent025905a3e4d50b9a2e07fbf4ff0a203af6604ced (diff)
parentaaa027f3229073e9a40756c3157d41af2a442922 (diff)
Merge pull request #2350 from MediaBrowser/beta
Beta
Diffstat (limited to 'MediaBrowser.Model/Net')
-rw-r--r--MediaBrowser.Model/Net/ISocket.cs28
-rw-r--r--MediaBrowser.Model/Net/ISocketFactory.cs43
-rw-r--r--MediaBrowser.Model/Net/IUdpSocket.cs27
-rw-r--r--MediaBrowser.Model/Net/IpAddressInfo.cs42
-rw-r--r--MediaBrowser.Model/Net/IpEndPointInfo.cs30
-rw-r--r--MediaBrowser.Model/Net/SocketReceiveResult.cs25
6 files changed, 195 insertions, 0 deletions
diff --git a/MediaBrowser.Model/Net/ISocket.cs b/MediaBrowser.Model/Net/ISocket.cs
new file mode 100644
index 000000000..aed35bce8
--- /dev/null
+++ b/MediaBrowser.Model/Net/ISocket.cs
@@ -0,0 +1,28 @@
+using System;
+
+namespace MediaBrowser.Model.Net
+{
+ public interface ISocket : IDisposable
+ {
+ bool DualMode { get; }
+ IpEndPointInfo LocalEndPoint { get; }
+ IpEndPointInfo RemoteEndPoint { get; }
+ void Close();
+ void Shutdown(bool both);
+ void Listen(int backlog);
+ void Bind(IpEndPointInfo endpoint);
+
+ void StartAccept(Action<ISocket> onAccept, Func<bool> isClosed);
+ }
+
+ public class SocketCreateException : Exception
+ {
+ public SocketCreateException(string errorCode, Exception originalException)
+ : base(errorCode, originalException)
+ {
+ ErrorCode = errorCode;
+ }
+
+ public string ErrorCode { get; private set; }
+ }
+}
diff --git a/MediaBrowser.Model/Net/ISocketFactory.cs b/MediaBrowser.Model/Net/ISocketFactory.cs
new file mode 100644
index 000000000..ac406e7f1
--- /dev/null
+++ b/MediaBrowser.Model/Net/ISocketFactory.cs
@@ -0,0 +1,43 @@
+
+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="IUdpSocket"/> interface.
+ /// </summary>
+ public interface ISocketFactory
+ {
+
+ /// <summary>
+ /// Createa a new unicast socket using the specified local port number.
+ /// </summary>
+ /// <param name="localPort">The local port to bind to.</param>
+ /// <returns>A <see cref="IUdpSocket"/> implementation.</returns>
+ IUdpSocket CreateUdpSocket(int localPort);
+
+ /// <summary>
+ /// Createa a new unicast socket using the specified local port number.
+ /// </summary>
+ IUdpSocket CreateSsdpUdpSocket(IpAddressInfo localIp, int localPort);
+
+ /// <summary>
+ /// Createa 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="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="IUdpSocket"/> implementation.</returns>
+ IUdpSocket CreateUdpMulticastSocket(string ipAddress, int multicastTimeToLive, int localPort);
+
+ ISocket CreateSocket(IpAddressFamily family, SocketType socketType, ProtocolType protocolType, bool dualMode);
+ }
+
+ public enum SocketType
+ {
+ Stream
+ }
+
+ public enum ProtocolType
+ {
+ Tcp
+ }
+}
diff --git a/MediaBrowser.Model/Net/IUdpSocket.cs b/MediaBrowser.Model/Net/IUdpSocket.cs
new file mode 100644
index 000000000..c70510726
--- /dev/null
+++ b/MediaBrowser.Model/Net/IUdpSocket.cs
@@ -0,0 +1,27 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+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 IUdpSocket : IDisposable
+ {
+ IpAddressInfo LocalIPAddress { get; }
+
+ /// <summary>
+ /// Waits for and returns the next UDP message sent to this socket (uni or multicast).
+ /// </summary>
+ /// <returns></returns>
+ Task<SocketReceiveResult> ReceiveAsync();
+
+ /// <summary>
+ /// Sends a UDP message to a particular end point (uni or multicast).
+ /// </summary>
+ Task SendAsync(byte[] buffer, int bytes, IpEndPointInfo endPoint);
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.Model/Net/IpAddressInfo.cs b/MediaBrowser.Model/Net/IpAddressInfo.cs
new file mode 100644
index 000000000..00a16c03d
--- /dev/null
+++ b/MediaBrowser.Model/Net/IpAddressInfo.cs
@@ -0,0 +1,42 @@
+using System;
+
+namespace MediaBrowser.Model.Net
+{
+ public class IpAddressInfo
+ {
+ public static IpAddressInfo Any = new IpAddressInfo("0.0.0.0", IpAddressFamily.InterNetwork);
+ public static IpAddressInfo IPv6Any = new IpAddressInfo("00000000000000000000", IpAddressFamily.InterNetworkV6);
+ public static IpAddressInfo Loopback = new IpAddressInfo("127.0.0.1", IpAddressFamily.InterNetwork);
+ public static IpAddressInfo IPv6Loopback = new IpAddressInfo("::1", IpAddressFamily.InterNetworkV6);
+
+ public string Address { get; set; }
+ public IpAddressFamily AddressFamily { get; set; }
+
+ public IpAddressInfo()
+ {
+
+ }
+
+ public IpAddressInfo(string address, IpAddressFamily addressFamily)
+ {
+ Address = address;
+ AddressFamily = addressFamily;
+ }
+
+ public bool Equals(IpAddressInfo address)
+ {
+ return string.Equals(address.Address, Address, StringComparison.OrdinalIgnoreCase);
+ }
+
+ public override String ToString()
+ {
+ return Address;
+ }
+ }
+
+ public enum IpAddressFamily
+ {
+ InterNetwork,
+ InterNetworkV6
+ }
+}
diff --git a/MediaBrowser.Model/Net/IpEndPointInfo.cs b/MediaBrowser.Model/Net/IpEndPointInfo.cs
new file mode 100644
index 000000000..b5cadc429
--- /dev/null
+++ b/MediaBrowser.Model/Net/IpEndPointInfo.cs
@@ -0,0 +1,30 @@
+using System;
+using System.Globalization;
+
+namespace MediaBrowser.Model.Net
+{
+ public class IpEndPointInfo
+ {
+ public IpAddressInfo IpAddress { get; set; }
+
+ public int Port { get; set; }
+
+ public IpEndPointInfo()
+ {
+
+ }
+
+ public IpEndPointInfo(IpAddressInfo address, int port)
+ {
+ IpAddress = address;
+ Port = port;
+ }
+
+ public override string ToString()
+ {
+ var ipAddresString = IpAddress == null ? string.Empty : IpAddress.ToString();
+
+ return ipAddresString + ":" + Port.ToString(CultureInfo.InvariantCulture);
+ }
+ }
+}
diff --git a/MediaBrowser.Model/Net/SocketReceiveResult.cs b/MediaBrowser.Model/Net/SocketReceiveResult.cs
new file mode 100644
index 000000000..483e2297b
--- /dev/null
+++ b/MediaBrowser.Model/Net/SocketReceiveResult.cs
@@ -0,0 +1,25 @@
+
+namespace MediaBrowser.Model.Net
+{
+ /// <summary>
+ /// Used by the sockets wrapper to hold raw data received from a UDP socket.
+ /// </summary>
+ public sealed class SocketReceiveResult
+ {
+ /// <summary>
+ /// The buffer to place received data into.
+ /// </summary>
+ public byte[] Buffer { get; set; }
+
+ /// <summary>
+ /// The number of bytes received.
+ /// </summary>
+ public int ReceivedBytes { get; set; }
+
+ /// <summary>
+ /// The <see cref="IpEndPointInfo"/> the data was received from.
+ /// </summary>
+ public IpEndPointInfo RemoteEndPoint { get; set; }
+ public IpAddressInfo LocalIPAddress { get; set; }
+ }
+}