Partager via


Expéditeurs et récepteurs PGM

L’établissement d’une session PGM est similaire à la routine d’établissement de connexion associée à une session TCP. Toutefois, l’écart significatif par rapport à une session TCP est que la sémantique du client et du serveur est inversée ; le serveur (l’expéditeur PGM) se connecte à un groupe de multidiffusion, tandis que le client (le récepteur PGM) attend d’accepter une connexion. Les paragraphes suivants détaillent les étapes de programmation nécessaires à la création d’un expéditeur PGM et d’un récepteur PGM. Cette page décrit également les modes de données disponibles pour les sessions PGM.

Expéditeur PGM

Pour créer un expéditeur PGM, procédez comme suit

  1. Créez un socket PGM.
  2. lier le socket à INADDR_ANY.
  3. se connecter à l’adresse de transmission du groupe de multidiffusion.

Aucune négociation de session formelle n’est effectuée avec les clients. Le processus de connexion est similaire à une connexion UDP, car il associe une adresse de point de terminaison (le groupe de multidiffusion) au socket. Une fois l’opération terminée, les données peuvent être envoyées sur le socket.

Lorsqu’un expéditeur crée un socket PGM et le connecte à une adresse de multidiffusion, une session PGM est créée. Une session de multidiffusion fiable est définie par une combinaison de l’identificateur global unique (GUID) et du port source. Le GUID est généré par le transport. Le port sSource est spécifié par le transport et aucun contrôle n’est fourni sur le port source utilisé.

Notes

La réception de données sur un socket d’expéditeur n’est pas autorisée et génère une erreur.

 

L’extrait de code suivant illustre la configuration d’un expéditeur PGM :


SOCKET        s;
SOCKADDR_IN   salocal, sasession;
int           dwSessionPort;

s = socket (AF_INET, SOCK_RDM, IPPROTO_RM);

salocal.sin_family = AF_INET;
salocal.sin_port   = htons (0);    // Port is ignored here
salocal.sin_addr.s_addr = htonl (INADDR_ANY);

bind (s, (SOCKADDR *)&salocal, sizeof(salocal));

//
// Set all relevant sender socket options here
//

//
// Now, connect <entity type="hellip"/>
// Setting the connection port (dwSessionPort) has relevance, and
// can be used to multiplex multiple sessions to the same
// multicast group address over different ports
//
dwSessionPort = 0;
sasession.sin_family = AF_INET;
sasession.sin_port   = htons (dwSessionPort);
sasession.sin_addr.s_addr = inet_addr ("234.5.6.7");

connect (s, (SOCKADDR *)&sasession, sizeof(sasession));

//
// We're now ready to send data!
//



Récepteur PGM

Pour créer un récepteur PGM, procédez comme suit

  1. Créez un socket PGM.
  2. liez le socket à l’adresse de groupe de multidiffusion sur laquelle l’expéditeur transmet.
  3. Appelez la fonction listen sur le socket pour placer le socket en mode d’écoute. La fonction listen retourne lorsqu’une session PGM est détectée sur l’adresse et le port du groupe de multidiffusion spécifiés.
  4. Appelez la fonction accept pour obtenir un nouveau handle de socket correspondant à la session.

Seules les données PGM d’origine (ODATA) déclenchent l’acceptation d’une nouvelle session. Par conséquent, d’autres trafics PGM (par exemple, des paquets SPM ou RDATA) peuvent être reçus par le transport, mais n’entraînent pas le retour de la fonction listen .

Une fois qu’une session est acceptée, le handle de socket retourné est utilisé pour recevoir des données.

Notes

L’envoi de données sur un socket de réception n’est pas autorisé et génère une erreur.

 

L’extrait de code suivant illustre la configuration d’un récepteur PGM :


SOCKET        s,
              sclient;
SOCKADDR_IN   salocal,
              sasession;
int           sasessionsz, dwSessionPort;

s = socket (AF_INET, SOCK_RDM, IPPROTO_RM);

//
// The bind port (dwSessionPort) specified should match that
// which the sender specified in the connect call
//
dwSessionPort = 0;
salocal.sin_family = AF_INET;
salocal.sin_port   = htons (dwSessionPort);    
salocal.sin_addr.s_addr = inet_addr ("234.5.6.7");

bind (s, (SOCKADDR *)&salocal, sizeof(salocal));

//
// Set all relevant receiver socket options here
//

listen (s, 10);

sasessionsz = sizeof(sasession);
sclient = accept (s, (SOCKADDR *)&sasession, &sasessionsz);

//
// accept will return the client socket and we are now ready
// to receive data on the new socket!
//



Modes de données

Les sessions PGM ont deux options pour les modes de données : le mode message et le mode flux.

Le mode message est approprié pour les applications qui doivent envoyer des messages discrets et est spécifié par un type de socket de SOCK_RDM. Le mode de flux est approprié pour les applications qui doivent envoyer des données de streaming à des récepteurs, tels que des applications vidéo ou vocales, et est spécifié par un type de socket de SOCK_STREAM. Le choix du mode a un effet sur la façon dont Winsock traite les données.

Prenons l’exemple suivant : un expéditeur PGM en mode message effectue trois appels à la fonction WSASend , chacun avec une mémoire tampon de 100 octets. Cette opération apparaît sur le réseau sous la forme de trois paquets PGM discrets. Côté récepteur, chaque appel à la fonction WSARecv ne retourne que 100 octets, même si une mémoire tampon de réception plus grande est fournie. En revanche, avec un expéditeur PGM en mode flux, ces trois transmissions de 100 octets peuvent être fusionnées en moins de trois paquets physiques sur le réseau (ou fusionnées en un objet blob de données côté récepteur). Par conséquent, lorsque le récepteur appelle l’une des fonctions de réception windows Sockets, toute quantité de données qui ont été reçues par le transport PGM peut être retournée à l’application sans tenir compte de la façon dont les données ont été transmises ou reçues physiquement.