Erstellen von Multicastanwendungen mithilfe des UDP-TransportsCreating Multicasting Applications using the UDP Transport

Multicastanwendungen senden kleine Nachrichten gleichzeitig an eine große Anzahl von Empfängern, ohne dass eine Punkt-zu-Punkt-Verbindung eingerichtet werden muss.Multicasting applications send small messages to a large number of recipients at the same time without the need to establish point to point connections. Bei diesen Anwendungen hat Geschwindigkeit Vorrang vor Zuverlässigkeit.The emphasis of such applications is speed over reliability. Das heißt, es ist wichtiger, Daten zeitgerecht zu senden, als sicherzustellen, dass eine Nachricht auch tatsächlich empfangen wird.In other words, it is more important to send timely data than to ensure any specific message is actually received. WCF unterstützt jetzt mit der UdpBinding das Schreiben von Multicastanwendungen.WCF now supports writing multicasting applications using the UdpBinding. Dieser Transport ist in Szenarien nützlich, in denen ein Dienst kleine Nachrichten an eine große Anzahl von Clients gleichzeitig senden muss.This transport is useful in scenarios where a service needs to send out small messages to a number of clients simultaneously. Eine Börsenticker-Anwendung ist ein Beispiel für einen solchen Dienst.A stock ticker application is an example of such a service.

Implementieren einer MulticastanwendungImplementing a Multicast Application

Um eine Multicastanwendung zu implementieren, definieren Sie einen Dienstvertrag und implementieren diesen für jede Softwarekomponente, die auf die Multicastnachrichten antworten muss.To implement a multicast application, define a service contract and for each software component that needs to respond to the multicast messages, implement the service contract. Zum Beispiel kann eine Börsenticker-Anwendung einen Dienstvertrag definieren:For example, a stock ticker application might define a service contract:

// 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;
    }
}

Jede Anwendung, die Multicastnachrichten empfangen möchte, muss einen Dienst hosten, der diese Schnittstelle verfügbar macht.Each application that wants to receive multicast messages must host a service that exposes this interface. Das folgende Codebeispiel veranschaulicht, wie Multicastnachrichten empfangen werden:For example, here is a code sample that illustrates how to receive multicast messages:

// 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);
// Openup the service host
host.Open();

Console.WriteLine("Start receiving stock information");
Console.ReadLine();

Die Anwendung gibt die UDP-Adresse an, an der alle Dienste lauschen.The application specifies the UDP address that all services will be listening on. Ein neuer ServiceHost wird erstellt, und mit der UdpBinding wird ein Dienstendpunkt verfügbar gemacht.A new ServiceHost is created and a service endpoint is exposed using the UdpBinding. Anschließend wird der ServiceHost geöffnet, und dieser beginnt mit dem Lauschen auf eingehende Meldungen.The ServiceHost is then opened and will start listening for incoming messages.

In diesem Szenariotyp werden Multicastnachrichten tatsächlich vom Client gesendet.In this type of a scenario it is the client that actually sends out multicast messages. Jeder Dienst, der an der richtigen UDP-Adresse lauscht, empfängt die Multicastnachrichten.Each service that is listening at the correct UDP address will receive the multicast messages. Im Folgenden finden Sie ein Beispiel für einen Client, der Multicastnachrichten sendet:Here is an example of a client that sends out multicast messages:

// 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 mulicast stock information
    proxy.SendStockInfo(GetStockInfo());
    Console.WriteLine(String.Format("sent stock info at {0}", DateTime.Now));
    // Wait for one second before sending another update
    System.Threading.Thread.Sleep(new TimeSpan(0, 0, 1));
}

Dieser Code generiert Börseninformationen und verwendet dann den Dienstvertrag IStockTicker, um Multicastnachrichten an Aufrufdienste zu senden, die an der richtigen UDP-Adresse lauschen.This code generates stock information and then uses the service contract IStockTicker to send multicast messages to call services listening on the correct UDP address.

UDP und zuverlässiges MessagingUDP and Reliable Messaging

Da es sich bei UDP um ein einfaches Protokoll handelt, unterstützt die UDP-Bindung kein zuverlässiges Messaging.The UDP binding does not support reliable messaging because of the lightweight nature of the UDP protocol. Wenn Sie sicherstellen müssen, dass Nachrichten von einem Remoteendpunkt empfangen werden, verwenden Sie einen Transport, der zuverlässiges Messaging unterstützt, z. B. HTTP oder TCP.If you need to confirm that messages are received by a remote endpoint, use a transport that supports reliable messaging like HTTP or TCP. Weitere Informationen zur zuverlässigen messaging finden Sie unter http://go.microsoft.com/fwlink/?LinkId=231830For more information about reliable messaging see http://go.microsoft.com/fwlink/?LinkId=231830

Bidirektionales MulticastmessagingTwo-way Multicast Messaging

Während Multicastnachrichten im Allgemeinen unidirektional sind, unterstützt UdpBinding den Austausch von Anforderungs-/Antwortnachrichten.While multicast messages are generally one-way, the UdpBinding does support request/reply message exchange. Die mithilfe des UDP-Transports gesendeten Nachrichten enthalten eine Absender- und eine Empfängeradresse.Messages sent using the UDP transport contain both a From and To address. Besondere Sorgfalt erfordert die Absenderadresse, da sie während der Übertragung möglicherweise böswillig geändert wurde.Care must be taken when using the From address as it could be maliciously changed en-route. Die Adresse kann mithilfe des folgenden Codes überprüft werden:The address can be checked using the following code:

if (address.AddressFamily == AddressFamily.InterNetwork)
{
    // IPv4
    byte[] addressBytes = address.GetAddressBytes();
    return ((addressBytes[0] & 0xE0) == 0xE0);
}
else
{
    // IPv6
    return address.IsIPv6Multicast;
}

Der Code überprüft das erste Byte der Absenderadresse, um zu ermitteln, ob sie 0xE0 enthält, was bedeutet, dass es sich um eine Multicastadresse handelt.This code checks the first byte of the From address to see if it contains 0xE0 which signifies that the address is a multi-cast address.

SicherheitsüberlegungenSecurity Considerations

Beim Lauschen auf Multicastnachrichten wird ein ICMP-Paket an den Router gesendet, um ihn davon in Kenntnis setzen, ob an der Multicastadresse gelauscht wird.When listening for multicast messages an ICMP packet is sent to the router notifying it you are listening on the multicast address. Jeder Benutzer im lokalen Subnetz mit entsprechender Berechtigung kann auf diese Pakettypen lauschen und ermitteln, an welcher Multicastadresse und welchem Port gelauscht wird.Anyone on the local subnet who has permissions could listen for these types of packets and determine which multicast address and port you are listening on.

Aus Sicherheitsgründen sollte die IP-Adresse des Absenders nicht verwendet werden.Do not use the IP address of the sender for any security purposes. Diese Information kann gespooft sein, sodass eine Anwendung Antworten an den falschen Computer sendet.This information can be spoofed and can cause an application to send responses to the wrong machine. Eine Möglichkeit, dieses Risiko abzuschwächen, ist das Aktivieren der Sicherheit auf Nachrichtenebene.One way to mitigate this threat is to enable message level security. Auf Netzwerkebene kann auch Internetprotokollsicherheit (Internet Protocol Security, IPSec) und/oder Netzwerkzugriffsschutz (Network Access Protection, NAP) verwendet werden.At the network level IPSec (Internet Protocol Security) and/or NAP (Network Access Protection) could also be used.