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, le départ significatif d’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 programmatiques 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
- Créez un socket PGM.
- lier le socket à INADDR_ANY.
- connecter à l’adresse de transmission du groupe de multidiffusion.
Aucune négociation de session formelle n’est effectuée avec tous les clients. Le processus de connexion est similaire à un UDP, dans le fait qu’il associe une adresse de point de terminaison (le groupe de multidiffusion) au socket. Une fois terminées, 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é.
Note
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
- Créez un socket PGM.
- lier le socket à l’adresse du groupe de multidiffusion sur laquelle l’expéditeur transmet.
- Appelez la fonction écouter sur le socket pour placer le socket en mode d’écoute. La fonction d’écoute retourne lorsqu’une session PGM est détectée sur l’adresse et le port du groupe de multidiffusion spécifiés.
- Appelez la fonction accepter 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 (tels que SPM ou paquets RDATA) peuvent être reçus par le transport, mais n’entraînent pas le retour de la fonction écouter.
Une fois qu’une session est acceptée, le handle de socket retourné est utilisé pour recevoir des données.
Note
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 de flux.
Le mode message est approprié pour les applications qui doivent envoyer des messages discrets et qui sont spécifiées par un type de socket de SOCK_RDM. Le mode flux est approprié pour les applications qui doivent envoyer des données de diffusion en continu à des récepteurs, tels que des applications vidéo ou vocales, et qui sont spécifiées par un type de socket de SOCK_STREAM. Le choix du mode affecte 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, chacune avec une mémoire tampon de 100 octets. Cette opération apparaît sur le câble sous la forme de trois paquets PGM discrets. Côté récepteur, chaque appel à la fonction WSARecv retourne seulement 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 d’octets de 100 octets peuvent être fusionnées en moins de trois paquets physiques sur le câble (ou fusionnés dans 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 de Windows Sockets, toute quantité de données 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 physiquement ou reçues.