Отправители и получатели PGM

Установка сеанса PGM аналогична процедуре установки подключения, связанной с сеансом TCP. Однако существенное отклонение от сеанса TCP заключается в том, что семантика клиента и сервера отменена; сервер (отправитель PGM) подключается к группе многоадресной рассылки, в то время как клиент (получатель PGM) ожидает принятия подключения. В следующих абзацах подробно описаны программные действия, необходимые для создания отправителя PGM и получателя PGM. На этой странице также описаны доступные режимы данных для сеансов PGM.

Отправитель PGM

Чтобы создать отправителя PGM, выполните следующие действия.

  1. Создайте сокет PGM.
  2. привязать сокет к INADDR_ANY.
  3. подключитесь к адресу многоадресной передачи.

Официальное подтверждение сеанса не выполняется ни с какими клиентами. Процесс подключения аналогичен UDP-подключению в том, что он связывает адрес конечной точки (группу многоадресной рассылки) с сокетом. После завершения данные могут отправляться в сокет.

Когда отправитель создает сокет PGM и подключает его к адресу многоадресной рассылки, создается сеанс PGM. Надежный сеанс многоадресной рассылки определяется сочетанием глобально уникального идентификатора (GUID) и порта источника. Идентификатор GUID создается транспортом. Порт sSource задается транспортом, и контроль над используемым исходным портом не предоставляется.

Примечание

Получение данных в сокете отправителя запрещено и приводит к ошибке.

 

В следующем фрагменте кода показана настройка отправителя 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!
//



Приемник PGM

Чтобы создать приемник PGM, выполните следующие действия.

  1. Создайте сокет PGM.
  2. привяжите сокет к адресу группы многоадресной рассылки, по которой передается отправитель.
  3. Вызовите функцию прослушивания для сокета, чтобы поместить сокет в режим прослушивания. Функция прослушивания возвращает значение при обнаружении сеанса PGM по указанному адресу и порту группы многоадресной рассылки.
  4. Вызовите функцию accept , чтобы получить новый дескриптор сокета, соответствующий сеансу.

Только исходные данные PGM (ODATA) активируют принятие нового сеанса. Таким образом, другой трафик PGM (например, SPM или пакеты RDATA) может быть получен транспортом, но не приводит к возврату функции прослушивания .

После принятия сеанса для получения данных используется возвращенный дескриптор сокета.

Примечание

Отправка данных в сокет приема запрещена и приводит к ошибке.

 

В следующем фрагменте кода показана настройка приемника 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!
//



Режимы данных

Сеансы PGM имеют два варианта для режимов данных: режим сообщений и режим потока.

Режим сообщений подходит для приложений, которым требуется отправлять дискретные сообщения, и определяется типом сокета SOCK_RDM. Режим потоковой передачи подходит для приложений, которым требуется отправлять потоковую передачу данных получателям, например видео- или голосовых приложений, и определяется типом сокета SOCK_STREAM. Выбор режима влияет на обработку данных Winsock.

Рассмотрим следующий пример: отправитель PGM в режиме сообщений выполняет три вызова функции WSASend , каждый из которых имеет 100-байтовой буфер. Эта операция отображается в сети в виде трех дискретных пакетов PGM. На стороне получателя каждый вызов функции WSARecv возвращает только 100 байт, даже если предоставлен буфер приема большего размера. В отличие от этого, с отправителем PGM в потоковом режиме эти три передачи по 100 байт можно объединить в менее чем три физических пакета по проводу (или объединить в один большой двоичный объект данных на стороне получателя). Таким образом, когда получатель вызывает одну из функций приема сокетов Windows, любой объем данных, полученных транспортом PGM, может быть возвращен в приложение независимо от того, как данные были физически переданы или получены.