Mittenti e ricevitori PGM

La definizione di una sessione PGM è simile alla routine di creazione della connessione associata a una sessione TCP. La significativa partenza da una sessione TCP, tuttavia, è che la semantica del client e del server viene invertita; il server (mittente PGM) si connette a un gruppo multicast, mentre il client (ricevitore PGM) attende di accettare una connessione. I paragrafi seguenti illustrano i passaggi programmatici necessari per la creazione di un mittente PGM e di un ricevitore PGM. Questa pagina descrive anche le modalità dati disponibili per le sessioni PGM.

Mittente PGM

Per creare un mittente PGM, seguire questa procedura

  1. Creare un socket PGM.
  2. associare il socket a INADDR_ANY.
  3. connettersi all'indirizzo di trasmissione del gruppo multicast.

Nessun handshaking formale della sessione viene eseguito con tutti i client. Il processo di connessione è simile a una connessione UDP, in quanto associa un indirizzo endpoint (il gruppo multicast) al socket. Al termine, i dati possono essere inviati sul socket.

Quando un mittente crea un socket PGM e lo connette a un indirizzo multicast, viene creata una sessione PGM. Una sessione multicast affidabile è definita da una combinazione dell'identificatore univoco globale (GUID) e della porta di origine. Il GUID viene generato dal trasporto. La porta sSource viene specificata dal trasporto e non viene fornito alcun controllo su quale porta di origine viene usata.

Nota

La ricezione dei dati in un socket del mittente non è consentita e genera un errore.

 

Il frammento di codice seguente illustra la configurazione di un mittente 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!
//



Ricevitore PGM

Per creare un ricevitore PGM, seguire questa procedura

  1. Creare un socket PGM.
  2. associare il socket all'indirizzo del gruppo multicast in cui il mittente trasmette.
  3. Chiamare la funzione di ascolto sul socket per inserire il socket in modalità di ascolto. La funzione di ascolto restituisce quando viene rilevata una sessione PGM nell'indirizzo e nella porta del gruppo multicast specificati.
  4. Chiamare la funzione accept per ottenere un nuovo handle socket corrispondente alla sessione.

Solo i dati PGM originali attivano l'accettazione di una nuova sessione. Ad esempio, altri traffico PGM (ad esempio pacchetti SPM o RDATA) possono essere ricevuti dal trasporto, ma non comportano la restituzione della funzione di ascolto .

Una volta accettata una sessione, viene usato l'handle socket restituito per la ricezione dei dati.

Nota

L'invio di dati in un socket di ricezione non è consentito e genera un errore.

 

Il frammento di codice seguente illustra la configurazione di un ricevitore 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!
//



Modalità dati

Le sessioni PGM dispongono di due opzioni per le modalità dati: modalità messaggio e modalità di flusso.

La modalità messaggio è appropriata per le applicazioni che devono inviare messaggi discreti e viene specificata da un tipo di socket di SOCK_RDM. La modalità di flusso è appropriata per le applicazioni che devono inviare dati di streaming ai ricevitori, ad esempio applicazioni video o vocali, e viene specificata da un tipo di socket di SOCK_STREAM. La scelta degli effetti della modalità in cui Winsock elabora i dati.

Si consideri l'esempio seguente: un mittente PGM in modalità messaggio effettua tre chiamate alla funzione WSASend , ognuna con un buffer a 100 byte. Questa operazione viene visualizzata sul filo come tre pacchetti PGM discreti. Sul lato ricevitore, ogni chiamata alla funzione WSARecv restituisce solo 100 byte, anche se viene fornito un buffer di ricezione più grande. Al contrario, con un mittente PGM in modalità di flusso tali tre trasmissioni di byte di 100 byte potrebbero essere raggruppate in meno di tre pacchetti fisici sul filo (o in un blob di dati sul lato ricevitore). Di conseguenza, quando il ricevitore chiama una delle funzioni di ricezione di Windows Socket, qualsiasi quantità di dati ricevuti dal trasporto PGM può essere restituita all'applicazione senza considerare il modo in cui i dati sono stati trasmessi fisicamente o ricevuti.