멀티캐스팅 애플리케이션은 지점 및 지점 연결을 설정할 필요 없이 동시에 많은 수의 받는 사람에게 작은 메시지를 보냅니다. 이러한 애플리케이션의 강조는 안정성보다 속도입니다. 즉, 특정 메시지가 실제로 수신되도록 하는 것보다 적시에 데이터를 보내는 것이 더 중요합니다. 이제 UdpBinding을(를) 사용하여 멀티캐스팅 애플리케이션을 작성하는 것이 WCF에서 지원됩니다. 이 전송은 서비스가 여러 클라이언트에 작은 메시지를 동시에 보내야 하는 시나리오에서 유용합니다. 주식 시세 애플리케이션은 이러한 서비스의 예입니다.
멀티캐스트 애플리케이션 구현
멀티캐스트 애플리케이션을 구현하려면 서비스 계약을 정의하고 멀티캐스트 메시지에 응답해야 하는 각 소프트웨어 구성 요소에 대해 서비스 계약을 구현합니다. 예를 들어 주식 시세 애플리케이션은 서비스 계약을 정의할 수 있습니다.
// Shared contracts between the client and the service
[ServiceContract]
interface IStockTicker
{
[OperationContract(IsOneWay = true)]
void SendStockInfo(StockInfo[] stockInfo);
}
[DataContract]
class StockInfo
{
[DataMember]
public string Symbol;
[DataMember]
public float Price;
public StockInfo(string symbol, float price)
{
this.Symbol = symbol;
this.Price = price;
}
}
멀티캐스트 메시지를 수신하려는 각 애플리케이션은 이 인터페이스를 노출하는 서비스를 호스트해야 합니다. 예를 들어 다음은 멀티캐스트 메시지를 받는 방법을 보여 주는 코드 샘플입니다.
// Service Address
string serviceAddress = "soap.udp://224.0.0.1:40000";
// Binding
UdpBinding myBinding = new UdpBinding();
// Host
ServiceHost host = new ServiceHost(typeof(StockTickerService), new Uri(serviceAddress));
// Add service endpoint
host.AddServiceEndpoint(typeof(IStockTicker), myBinding, string.Empty);
// Open up the service host
host.Open();
Console.WriteLine("Start receiving stock information");
Console.ReadLine();
애플리케이션은 모든 서비스가 수신 대기할 UDP 주소를 지정합니다. 새 ServiceHost이(가) 생성되고 UdpBinding을(를) 사용하여 서비스 엔드포인트가 노출됩니다. ServiceHost 그런 다음 이 메시지가 열리고 들어오는 메시지 수신 대기가 시작됩니다.
이 유형의 시나리오에서는 실제로 멀티캐스트 메시지를 보내는 클라이언트입니다. 올바른 UDP 주소에서 수신 대기하는 각 서비스는 멀티캐스트 메시지를 받습니다. 다음은 멀티캐스트 메시지를 보내는 클라이언트의 예입니다.
// Multicast Address
string serviceAddress = "soap.udp://224.0.0.1:40000";
// Binding
UdpBinding myBinding = new UdpBinding();
// Channel factory
ChannelFactory<IStockTicker> factory
= new ChannelFactory<IStockTicker>(myBinding,
new EndpointAddress(serviceAddress));
// Call service
IStockTicker proxy = factory.CreateChannel();
while (true)
{
// This will continue to multicast stock information
proxy.SendStockInfo(GetStockInfo());
Console.WriteLine($"sent stock info at {DateTime.Now}");
// Wait for one second before sending another update
System.Threading.Thread.Sleep(new TimeSpan(0, 0, 1));
}
이 코드는 주식 정보를 생성한 다음 서비스 계약 IStockTicker를 사용하여 올바른 UDP 주소에서 수신 대기하는 서비스를 호출하는 멀티캐스트 메시지를 보냅니다.
UDP 및 신뢰할 수 있는 메시징
UDP 바인딩은 UDP 프로토콜의 간단한 특성 때문에 신뢰할 수 있는 메시징을 지원하지 않습니다. 원격 엔드포인트에서 메시지를 받는지 확인해야 하는 경우 HTTP 또는 TCP와 같은 신뢰할 수 있는 메시징을 지원하는 전송을 사용합니다. 신뢰할 수 있는 메시징에 대한 자세한 내용은 다음을 참조하세요 https://go.microsoft.com/fwlink/?LinkId=231830.
양방향 멀티캐스트 메시징
멀티캐스트 메시지는 일반적으로 단방향이지만 UdpBinding은 요청/회신 메시지 교환을 지원합니다. UDP 전송을 사용하여 보낸 메시지에는 보낸 사람 및 받는 사람 주소가 모두 포함됩니다. 보낸 사람 주소는 경로에서 악의적으로 변경될 수 있기 때문에 사용할 때 주의해야 합니다. 다음 코드를 사용하여 주소를 확인할 수 있습니다.
if (address.AddressFamily == AddressFamily.InterNetwork)
{
// IPv4
byte[] addressBytes = address.GetAddressBytes();
return ((addressBytes[0] & 0xE0) == 0xE0);
}
else
{
// IPv6
return address.IsIPv6Multicast;
}
이 코드는 발신 주소의 첫 번째 바이트를 확인하여 0xE0을 포함하는지 확인하고, 이 값이 있을 경우 주소가 다중 캐스트 주소임을 나타냅니다.
보안 고려사항
멀티캐스트 메시지를 수신 대기하는 경우 멀티캐스트 주소에서 수신 대기 중임을 알리는 ICMP 패킷이 라우터로 전송됩니다. 권한이 있는 로컬 서브넷의 모든 사용자는 이러한 유형의 패킷을 수신 대기하고 수신 대기 중인 멀티캐스트 주소 및 포트를 결정할 수 있습니다.
보안 목적으로 보낸 사람의 IP 주소를 사용하지 마세요. 이 정보는 스푸핑될 수 있으며 애플리케이션이 잘못된 컴퓨터에 응답을 보내도록 할 수 있습니다. 이 위협을 완화하는 한 가지 방법은 메시지 수준 보안을 사용하도록 설정하는 것입니다. 네트워크 수준 IPSec(인터넷 프로토콜 보안) 및/또는 NAP(네트워크 액세스 보호)도 사용할 수 있습니다.