// // Copyright (c) Microsoft Corporation. All rights reserved. // namespace System.ServiceModel.Channels { using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Net; using System.Net.Sockets; using System.Runtime; using System.Runtime.Diagnostics; using System.ServiceModel.Diagnostics; using System.Threading; using System.Xml; internal class ClientUdpOutputChannel : UdpOutputChannel { private EndpointAddress to; public ClientUdpOutputChannel(ChannelManagerBase factory, IPEndPoint remoteEndPoint, MessageEncoder encoder, BufferManager bufferManager, UdpSocket[] sendSockets, UdpRetransmissionSettings retransmissionSettings, EndpointAddress to, Uri via, bool isMulticast) : base(factory, encoder, bufferManager, sendSockets, retransmissionSettings, via, isMulticast) { Fx.Assert(to != null, "to address can't be null for this constructor..."); Fx.Assert(remoteEndPoint != null, "remoteEndPoint can't be null"); this.RemoteEndPoint = remoteEndPoint; this.to = to; } public IPEndPoint RemoteEndPoint { get; private set; } protected override UdpSocket[] GetSendSockets(Message message, out IPEndPoint remoteEndPoint, out Exception exceptionToBeThrown) { UdpSocket[] socketList = null; remoteEndPoint = this.RemoteEndPoint; exceptionToBeThrown = null; if (this.IsMulticast) { // always send on all sockets... socketList = this.SendSockets; } else { Fx.Assert(this.SendSockets.Length == 1, "Unicast Send socket list on client should always be 1 item long"); socketList = this.SendSockets; } return socketList; } protected override void AddHeadersTo(Message message) { Fx.Assert(message != null, "Message can't be null"); if (message.Version.Addressing != AddressingVersion.None) { this.to.ApplyTo(message); } message.Properties.Via = this.Via; base.AddHeadersTo(message); } } }