Freigeben über


PGM-Absender und Empfänger

Das Einrichten einer PGM-Sitzung ähnelt der Verbindungseinrichtungsroutine, die einer TCP-Sitzung zugeordnet ist. Die wesentliche Abkehr von einer TCP-Sitzung besteht jedoch darin, dass die Client- und Serversemantik umgekehrt werden; Der Server (der PGM-Absender) stellt eine Verbindung mit einer Multicastgruppe her, während der Client (der PGM-Empfänger) wartet, bis eine Verbindung akzeptiert wird. In den folgenden Absätzen werden die programmgesteuerten Schritte zum Erstellen eines PGM-Absenders und eines PGM-Empfängers beschrieben. Auf dieser Seite werden auch die verfügbaren Datenmodi für PGM-Sitzungen beschrieben.

PGM-Absender

Führen Sie zum Erstellen eines PGM-Absenders die folgenden Schritte

  1. Erstellen Sie einen PGM-Socket.
  2. binden Sie socket an INADDR_ANY.
  3. verbinden mit der Multicast-Gruppenübertragungsadresse.

Es wird keine formale Sitzungs-Handshaking mit clients ausgeführt. Der Verbindungsvorgang ähnelt einem UDP-verbinden, in dem eine Endpunktadresse (die Multicastgruppe) dem Socket zugeordnet wird. Nach Abschluss der Daten können Daten an den Socket gesendet werden.

Wenn ein Absender einen PGM-Socket erstellt und mit einer Multicastadresse verbindet, wird eine PGM-Sitzung erstellt. Eine zuverlässige Multicastsitzung wird durch eine Kombination aus der GUID (Globally Unique Identifier) und dem Quellport definiert. Die GUID wird vom Transport generiert. Der sSource-Port wird vom Transport angegeben, und es wird keine Kontrolle über den verwendeten Quellport bereitgestellt.

Anmerkung

Das Empfangen von Daten in einem Absendersocket ist nicht zulässig und führt zu einem Fehler.

 

Der folgende Codeausschnitt veranschaulicht das Einrichten eines PGM-Absenders:


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!
//



PGM-Empfänger

Führen Sie zum Erstellen eines PGM-Empfängers die folgenden Schritte

  1. Erstellen Sie einen PGM-Socket.
  2. bindung socket an die Multicast-Gruppenadresse, an die der Absender übertragen wird.
  3. Rufen Sie die listen-Funktion auf dem Socket auf, um den Socket in den Überwachungsmodus zu versetzen. Die Listenfunktion gibt zurück, wenn eine PGM-Sitzung für die angegebene Multicast-Gruppenadresse und den angegebenen Port erkannt wird.
  4. Rufen Sie die akzeptieren Funktion auf, um ein neues Sockethandle abzurufen, das der Sitzung entspricht.

Nur ursprüngliche PGM-Daten (ODATA) lösen die Annahme einer neuen Sitzung aus. Daher können andere PGM-Datenverkehr (z. B. SPM- oder RDATA-Pakete) vom Transport empfangen werden, führen jedoch nicht dazu, dass die Funktion zurückgeben.

Sobald eine Sitzung akzeptiert wurde, wird der zurückgegebene Sockethandle zum Empfangen von Daten verwendet.

Anmerkung

Das Senden von Daten in einem Empfangssocket ist nicht zulässig und führt zu einem Fehler.

 

Der folgende Codeausschnitt veranschaulicht das Einrichten eines PGM-Empfängers:


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!
//



Datenmodi

PGM-Sitzungen haben zwei Optionen für Datenmodi: Nachrichtenmodus und Streammodus.

Der Nachrichtenmodus eignet sich für Anwendungen, die diskrete Nachrichten senden müssen, und wird durch einen Sockettyp von SOCK_RDM angegeben. Der Streammodus eignet sich für Anwendungen, die Streamingdaten an Empfänger senden müssen, z. B. Video- oder Sprachanwendungen, und wird durch einen Sockettyp von SOCK_STREAM angegeben. Die Auswahl des Modus wirkt sich auf die Art und Art der Datenprozesse aus.

Betrachten Sie das folgende Beispiel: Ein Nachrichtenmodus-PGM-Absender führt drei Aufrufe an die WSASend--Funktion, die jeweils einen 100-Byte-Puffer enthält. Dieser Vorgang wird auf dem Draht als drei diskrete PGM-Pakete angezeigt. Auf der Empfängerseite gibt jeder Aufruf der WSARecv-Funktion nur 100 Byte zurück, auch wenn ein größerer Empfangspuffer bereitgestellt wird. Im Gegensatz dazu könnten diese drei 100 Byteübertragungen mit einem Streammodus-PGM-Absender in weniger als drei physische Pakete auf dem Draht zusammengeführt werden (oder in einem Blob mit Daten auf der Empfängerseite zusammengeführt werden). Wenn der Empfänger eine der Windows Sockets-Empfangsfunktionen aufruft, kann jede Menge von Daten, die vom PGM-Transport empfangen wurden, an die Anwendung zurückgegeben werden, ohne zu berücksichtigen, wie die Daten physisch übertragen oder empfangen wurden.