Source/Tx.Network/Udp/UdpEnvelopeReceiver.cs (63 lines of code) (raw):
namespace Tx.Network
{
using System;
using System.Net;
using System.Reactive;
public class UdpEnvelopeReceiver : BaseUdpReceiver<IEnvelope>
{
public UdpEnvelopeReceiver(IPEndPoint listenEndPoint, uint concurrentReceivers = 10)
: base(listenEndPoint, concurrentReceivers)
{
}
protected override bool TryParse(IpPacket packet, out IEnvelope envelope)
{
envelope = null;
if (!packet.PacketHeader.DestinationIpAddress.Equals(this.ListenEndPoint.Address))
{
return false;
}
var upacket = packet.ToUdpDatagram();
var isValid = upacket.UdpDatagramHeader.DestinationPort == this.ListenEndPoint.Port;
if (isValid)
{
envelope = new UdpEnvelope
{
OccurrenceTime = packet.ReceivedTime,
ReceivedTime = packet.ReceivedTime,
Payload = packet.PacketData.Array,
PayloadInstance = upacket,
};
}
return isValid;
}
private sealed class UdpEnvelope : IEnvelope
{
private static readonly string typeId = typeof(UdpDatagram).GetTypeIdentifier();
public DateTimeOffset OccurrenceTime { get; internal set; }
public DateTimeOffset ReceivedTime { get; internal set; }
public byte[] Payload { get; internal set; }
public object PayloadInstance { get; internal set; }
public string Source
{
get
{
return string.Empty;
}
}
public string Protocol
{
get
{
return Tx.Network.Protocol.UdpDatagram;
}
}
public string TypeId
{
get
{
return typeId;
}
}
}
}
}