Mittenti e ricevitori PGM
Stabilire una sessione PGM è simile alla routine di definizione 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 in dettaglio i passaggi a livello di codice 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
- Creare un socket PGM.
- associare socket a INADDR_ANY.
- connettere all'indirizzo di trasmissione del gruppo multicast.
Nessun handshaking di sessione formale viene eseguito con i client. Il processo di connessione è simile a un 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 di 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
- Creare un socket PGM.
- associare socket all'indirizzo del gruppo multicast in cui il mittente sta trasmettendo.
- Chiamare la funzionedi ascoltosul socket per mettere il socket in modalità di ascolto. La funzione listen restituisce quando viene rilevata una sessione PGM sull'indirizzo e sulla porta del gruppo multicast specificati.
- Chiamare la accettare funzione per ottenere un nuovo handle socket corrispondente alla sessione.
Solo i dati PGM originali (ODATA) attivano l'accettazione di una nuova sessione. Di conseguenza, altri traffico PGM (ad esempio pacchetti SPM o RDATA) possono essere ricevuti dal trasporto, ma non comportano la restituzione di funzione di ascolto.
Una volta accettata una sessione, viene usato l'handle socket restituito per la ricezione dei dati.
Nota
L'invio di dati su 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 hanno due opzioni per le modalità dati: la modalità messaggio e la modalità 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, ed è specificata da un tipo di socket di SOCK_STREAM. La scelta della modalità influisce sul modo in cui Winsock elabora i dati.
Si consideri l'esempio seguente: un mittente PGM in modalità messaggio effettua tre chiamate alla funzione diWSASend, ognuna con un buffer a 100 byte. Questa operazione viene visualizzata in transito 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à flusso, tali tre trasmissioni a 100 byte possono essere raggruppate in meno di tre pacchetti fisici sul filo (o raggruppati in un BLOB di dati sul lato ricevitore). Di conseguenza, quando il ricevitore chiama una delle funzioni di ricezione di Windows Sockets, 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.