Partager via


Création d’applications de multidiffusion à l’aide du transport UDP

Les applications de multidiffusion envoient de petits messages à un grand nombre de destinataires en même temps sans avoir besoin d’établir des connexions de point à point. L'accent des ces applications est mis sur la vitesse plutôt que sur la fiabilité. En d’autres termes, il est plus important d’envoyer des données en temps opportun que de s’assurer que tout message spécifique est réellement reçu. WCF prend désormais en charge l’écriture d’applications de multidiffusion à l’aide du UdpBinding. Ce transport est utile dans les scénarios où un service doit envoyer simultanément de petits messages à un certain nombre de clients. Une application de ticker boursier est un exemple de ce service.

Implémentation d’une application multidiffusion

Pour implémenter une application de multidiffusion, définissez un contrat de service et pour chaque composant logiciel qui doit répondre aux messages de multidiffusion, implémentez le contrat de service. Par exemple, une application boursière peut définir un contrat de service :

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

Chaque application qui souhaite recevoir des messages de multidiffusion doit héberger un service qui expose cette interface. Par exemple, voici un exemple de code qui montre comment recevoir des messages de multidiffusion :

// 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();

L’application spécifie l’adresse UDP sur laquelle tous les services seront à l’écoute. Un nouveau ServiceHost est créé et un point de terminaison de service est exposé à l’aide du UdpBinding. ServiceHost est ensuite ouvert et va commencer à écouter les messages entrants.

Dans ce type de scénario, il s’agit du client qui envoie réellement des messages de multidiffusion. Chaque service qui écoute à l’adresse UDP correcte reçoit les messages de multidiffusion. Voici un exemple de client qui envoie des messages de multidiffusion :

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

Ce code génère les informations boursières, puis utilise le contrat de service IStockTicker de façon à envoyer des messages de multidiffusion et appeler les services à l'écoute sur l'adresse UDP appropriée.

UDP et messagerie fiable

La liaison UDP ne prend pas en charge la messagerie fiable en raison de la nature légère du protocole UDP. Si vous devez confirmer que les messages sont reçus par un point de terminaison distant, utilisez un transport qui prend en charge la messagerie fiable comme HTTP ou TCP. Pour plus d’informations sur la messagerie fiable, consultez la rubriquehttps://go.microsoft.com/fwlink/?LinkId=231830.

Messagerie de multidiffusion bidirectionnelle

Bien que les messages de multidiffusion soient généralement unidirectionnels, UdpBinding prend en charge l'échange de messages de type demande/réponse. Les messages envoyés à l’aide du transport UDP contiennent à la fois une adresse De et À. Les précautions doivent être prises lors de l’utilisation de l’adresse From, car elle pourrait être modifiée de manière malveillante en route. L’adresse peut être vérifiée à l’aide du code suivant :

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

Ce code vérifie le premier octet de l’adresse From pour voir s’il contient 0xE0 ce qui signifie que l’adresse est une adresse multi-cast.

Considérations relatives à la sécurité

Lorsque vous écoutez des messages de multidiffusion, un paquet ICMP est envoyé au routeur pour l’avertir que vous écoutez sur l’adresse de multidiffusion. Toute personne sur le sous-réseau local disposant d’autorisations peut écouter ces types de paquets et déterminer l’adresse de multidiffusion et le port sur lesquels vous écoutez.

N’utilisez pas l’adresse IP de l’expéditeur à des fins de sécurité. Ces informations peuvent être usurpées et peuvent entraîner l’envoi de réponses à un ordinateur incorrect. Une façon d’atténuer cette menace consiste à activer la sécurité au niveau des messages. Au niveau du réseau, IPSec (Sécurité du protocole Internet) et/ou NAP (Protection de l’accès réseau) peuvent également être utilisés.