Remetentes e receptores pgm
Estabelecer uma sessão PGM é semelhante à rotina de estabelecimento de conexão associada a uma sessão TCP. A saída significativa de uma sessão TCP, no entanto, é que a semântica do cliente e do servidor é invertida; o servidor (o remetente PGM) se conecta a um grupo multicast, enquanto o cliente (o receptor PGM) aguarda para aceitar uma conexão. Os parágrafos a seguir detalham as etapas programáticas necessárias para criar um remetente PGM e um receptor PGM. Esta página também descreve os modos de dados disponíveis para sessões PGM.
Remetente PGM
Para criar um remetente PGM, execute as etapas a seguir
- Crie um soquete PGM.
- associe o soquete a INADDR_ANY.
- conecte-se ao endereço de transmissão do grupo multicast.
Nenhum handshaking de sessão formal é executado com nenhum cliente. O processo de conexão é semelhante a uma conexão UDP, pois associa um endereço de ponto de extremidade (o grupo multicast) ao soquete. Depois de concluídos, os dados podem ser enviados no soquete.
Quando um remetente cria um soquete PGM e o conecta a um endereço multicast, uma sessão PGM é criada. Uma sessão multicast confiável é definida por uma combinação do GUID (identificador global exclusivo) e da porta de origem. O GUID é gerado pelo transporte. A porta sSource é especificada pelo transporte e nenhum controle é fornecido sobre qual porta de origem é usada.
Observação
O recebimento de dados em um soquete do remetente não é permitido e resulta em um erro.
O snippet de código a seguir ilustra a configuração de um remetente 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 criar um receptor PGM, execute as etapas a seguir
- Crie um soquete PGM.
- associe o soquete ao endereço do grupo multicast no qual o remetente está transmitindo.
- Chame a função de escuta no soquete para colocar o soquete no modo de escuta. A função de escuta retorna quando uma sessão PGM é detectada no endereço e na porta do grupo multicast especificados.
- Chame a função accept para obter um novo identificador de soquete correspondente à sessão.
Somente os dados pgm originais (ODATA) disparam a aceitação de uma nova sessão. Dessa forma, outro tráfego PGM (como pacotes SPM ou RDATA) pode ser recebido pelo transporte, mas não resulta no retorno da função de escuta .
Depois que uma sessão é aceita, o identificador de soquete retornado é usado para receber dados.
Observação
O envio de dados em um soquete de recebimento não é permitido e resulta em um erro.
O snippet de código a seguir ilustra a configuração de um 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 dados
As sessões PGM têm duas opções para modos de dados: modo de mensagem e modo de fluxo.
O modo de mensagem é apropriado para aplicativos que precisam enviar mensagens discretas e é especificado por um tipo de soquete de SOCK_RDM. O modo de fluxo é apropriado para aplicativos que precisam enviar dados de streaming para receptores, como aplicativos de vídeo ou voz, e é especificado por um tipo de soquete de SOCK_STREAM. A escolha do modo afeta como o Winsock processa dados.
Considere o seguinte exemplo: um remetente PGM do modo de mensagem faz três chamadas para a função WSASend , cada uma com um buffer de 100 bytes. Essa operação aparece no fio como três pacotes PGM discretos. No lado do receptor, cada chamada para a função WSARecv retorna apenas 100 bytes, mesmo que um buffer de recebimento maior seja fornecido. Por outro lado, com um remetente PGM no modo de fluxo, essas três transmissões de 100 bytes podem ser agrupadas em menos de três pacotes físicos no fio (ou unidos em um blob de dados no lado do receptor). Dessa forma, quando o receptor chama uma das funções de recebimento do Windows Sockets, qualquer quantidade de dados recebidos pelo transporte PGM pode ser retornada ao aplicativo sem considerar como os dados foram fisicamente transmitidos ou recebidos.