jellyfin/MediaBrowser.Dlna/Ssdp/Datagram.cs

98 lines
3.0 KiB
C#
Raw Normal View History

2014-04-10 15:06:54 +00:00
using MediaBrowser.Model.Logging;
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
2014-04-25 17:30:41 +00:00
namespace MediaBrowser.Dlna.Ssdp
2014-04-10 15:06:54 +00:00
{
public class Datagram
{
2014-05-01 03:24:55 +00:00
public IPEndPoint ToEndPoint { get; private set; }
2014-06-22 05:52:31 +00:00
public IPEndPoint FromEndPoint { get; private set; }
2014-04-10 15:06:54 +00:00
public string Message { get; private set; }
2014-04-25 17:30:41 +00:00
/// <summary>
/// The number of times to send the message
/// </summary>
public int TotalSendCount { get; private set; }
/// <summary>
/// The number of times the message has been sent
/// </summary>
2014-04-10 15:06:54 +00:00
public int SendCount { get; private set; }
public bool HandleBindError { get; set; }
2014-04-10 15:06:54 +00:00
private readonly ILogger _logger;
2014-06-22 05:52:31 +00:00
public Datagram(IPEndPoint toEndPoint, IPEndPoint fromEndPoint, ILogger logger, string message, int totalSendCount)
2014-04-10 15:06:54 +00:00
{
Message = message;
_logger = logger;
2014-04-25 17:30:41 +00:00
TotalSendCount = totalSendCount;
2014-05-01 03:24:55 +00:00
FromEndPoint = fromEndPoint;
ToEndPoint = toEndPoint;
2014-04-10 15:06:54 +00:00
}
public void Send()
{
var msg = Encoding.ASCII.GetBytes(Message);
try
{
2014-04-25 17:30:41 +00:00
var client = CreateSocket();
2014-05-01 03:24:55 +00:00
if (FromEndPoint != null)
{
try
{
client.Bind(FromEndPoint);
}
catch
{
if (!HandleBindError)
{
throw;
}
}
2014-05-01 03:24:55 +00:00
}
2014-04-25 17:30:41 +00:00
2014-05-01 03:24:55 +00:00
client.BeginSendTo(msg, 0, msg.Length, SocketFlags.None, ToEndPoint, result =>
2014-04-10 15:06:54 +00:00
{
try
{
client.EndSend(result);
}
catch (Exception ex)
{
2014-06-22 05:52:31 +00:00
_logger.ErrorException("Error sending Datagram to {0} from {1}: " + Message, ex, ToEndPoint, FromEndPoint == null ? "" : FromEndPoint.ToString());
2014-04-10 15:06:54 +00:00
}
finally
{
try
{
client.Close();
}
catch (Exception)
{
}
}
}, null);
}
catch (Exception ex)
{
2014-08-26 02:30:52 +00:00
_logger.ErrorException("Error sending Datagram to {0} from {1}: " + Message, ex, ToEndPoint, FromEndPoint == null ? "" : FromEndPoint.ToString());
2014-04-10 15:06:54 +00:00
}
++SendCount;
}
2014-04-25 17:30:41 +00:00
private Socket CreateSocket()
{
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
return socket;
}
2014-04-10 15:06:54 +00:00
}
}