Поделиться через


Отправители и получатели 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. Вызовите функцию принять, чтобы получить новый дескриптор сокета, соответствующий сеансу.

Только исходные данные 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 эти три байта передачи можно объединить менее чем в три физических пакета на проводе (или объединиться в один большой двоичный объект данных на стороне получателя). Таким образом, когда получатель вызывает одну из функций получения сокетов Windows, любой объем данных, полученных транспортом PGM, может быть возвращен в приложение без учета того, как данные были физически переданы или получены.