Отправители и получатели PGM
Установка сеанса PGM аналогична подпрограмме создания подключения, связанной с сеансом TCP. Однако значительное отклонение сеанса TCP заключается в том, что семантика клиента и сервера отменена; Сервер (отправитель PGM) подключается к группе многоадресной рассылки, а клиент (получатель PGM) ожидает принятия подключения. В следующих абзацах подробно описаны программные действия, необходимые для создания отправителя PGM и получателя PGM. На этой странице также описываются доступные режимы данных для сеансов PGM.
Отправитель PGM
Чтобы создать отправителя PGM, выполните следующие действия
- Создайте сокет PGM.
- привязать сокет к INADDR_ANY.
- подключить к адресу передачи многоадресной группы.
Формальное подтверждение сеанса не выполняется с любыми клиентами. Процесс подключения похож на 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, выполните следующие действия
- Создайте сокет PGM.
- привязать сокет к адресу группы многоадресной рассылки, по которому передается отправитель.
- Вызовите функциюпрослушиванияв сокете, чтобы поместить сокет в режим прослушивания. Функция прослушивания возвращается при обнаружении сеанса PGM на указанном адресе и порту группы многоадресной рассылки.
- Вызовите функцию принять, чтобы получить новый дескриптор сокета, соответствующий сеансу.
Только исходные данные 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, может быть возвращен в приложение без учета того, как данные были физически переданы или получены.