Remitentes y receptores PGM

Establecer una sesión PGM es similar a la rutina de establecimiento de conexión asociada a una sesión TCP. Sin embargo, la salida significativa de una sesión TCP es que se invierte la semántica del cliente y del servidor; el servidor (el remitente PGM) se conecta a un grupo de multidifusión, mientras que el cliente (el receptor PGM) espera a aceptar una conexión. En los párrafos siguientes se detallan los pasos de programación necesarios para crear un remitente PGM y un receptor PGM. En esta página también se describen los modos de datos disponibles para las sesiones PGM.

Remitente PGM

Para crear un remitente PGM, realice los pasos siguientes:

  1. Cree un socket PGM.
  2. enlace el socket a INADDR_ANY.
  3. conéctese a la dirección de transmisión del grupo de multidifusión.

No se realiza ningún protocolo de enlace de sesión formal con ningún cliente. El proceso de conexión es similar a una conexión UDP, en que asocia una dirección de punto de conexión (el grupo de multidifusión) con el socket. Una vez completado, los datos se pueden enviar en el socket.

Cuando un remitente crea un socket PGM y lo conecta a una dirección de multidifusión, se crea una sesión PGM. Una sesión de multidifusión confiable se define mediante una combinación del identificador único global (GUID) y el puerto de origen. El transporte genera el GUID. El puerto sSource se especifica mediante el transporte y no se proporciona ningún control sobre el que se usa el puerto de origen.

Nota

No se permite la recepción de datos en un socket de remitente y se produce un error.

 

En el fragmento de código siguiente se muestra cómo configurar un remitente 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!
//



Receptor PGM

Para crear un receptor PGM, realice los pasos siguientes:

  1. Cree un socket PGM.
  2. enlace el socket a la dirección del grupo de multidifusión en la que se transmite el remitente.
  3. Llame a la función de escucha en el socket para colocar el socket en modo de escucha. La función de escucha devuelve cuando se detecta una sesión PGM en la dirección y el puerto de grupo de multidifusión especificados.
  4. Llame a la función accept para obtener un nuevo identificador de socket correspondiente a la sesión.

Solo los datos PGM originales (ODATA) desencadenan la aceptación de una nueva sesión. Por lo tanto, el transporte puede recibir otro tráfico PGM (como paquetes SPM o RDATA), pero no da lugar a que la función de escucha devuelva.

Una vez aceptada una sesión, se usa el identificador de socket devuelto para recibir datos.

Nota

No se permite el envío de datos en un socket de recepción y se produce un error.

 

En el fragmento de código siguiente se muestra cómo configurar un receptor 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!
//



Modos de datos

Las sesiones PGM tienen dos opciones para los modos de datos: el modo de mensaje y el modo de secuencia.

El modo de mensaje es adecuado para las aplicaciones que necesitan enviar mensajes discretos y se especifica mediante un tipo de socket de SOCK_RDM. El modo stream es adecuado para las aplicaciones que necesitan enviar datos de streaming a receptores, como aplicaciones de vídeo o voz, y se especifica mediante un tipo de socket de SOCK_STREAM. La elección del modo afecta a cómo Winsock procesa los datos.

Considere el ejemplo siguiente: un remitente PGM en modo de mensaje realiza tres llamadas a la función WSASend , cada una con un búfer de 100 bytes. Esta operación aparece en la conexión como tres paquetes PGM discretos. En el lado receptor, cada llamada a la función WSARecv devuelve solo 100 bytes, incluso si se proporciona un búfer de recepción mayor. Por el contrario, con un remitente PGM en modo de flujo, esas tres transmisiones de 100 bytes podrían fusionarse en menos de tres paquetes físicos en la conexión (o se fusionan en un blob de datos en el lado receptor). Por lo tanto, cuando el receptor llama a una de las funciones de recepción de Windows Sockets, cualquier cantidad de datos recibidos por el transporte PGM puede devolverse a la aplicación sin tener en cuenta cómo se transmitieron o recibieron físicamente los datos.