Share via


PGM 보낸 사람 및 수신자

PGM 세션 설정은 TCP 세션과 연결된 연결 설정 루틴과 유사합니다. 그러나 TCP 세션에서 중요한 출발은 클라이언트 및 서버 의미 체계가 반전된다는 것입니다. 서버(PGM 발신자)는 멀티캐스트 그룹에 연결하고 클라이언트(PGM 수신기)는 연결을 수락하기 위해 대기합니다. 다음 단락에서는 PGM 발신자 및 PGM 수신기를 만드는 데 필요한 프로그래밍 단계를 자세히 설명합니다. 이 페이지에서는 PGM 세션에 사용할 수 있는 데이터 모드도 설명합니다.

PGM 발신자

PGM 발신자를 만들려면 다음 단계를 수행합니다.

  1. PGM 소켓을 만듭니다.
  2. 소켓을 INADDR_ANY 바인딩합니다.
  3. 멀티캐스트 그룹 전송 주소에 연결합니다.

어떤 클라이언트와도 공식적인 세션 핸드셰이크가 수행되지 않습니다. 연결 프로세스는 엔드포인트 주소(멀티캐스트 그룹)를 소켓과 연결한다는 점에서 UDP 연결과 유사합니다. 완료되면 소켓에 데이터를 보낼 수 있습니다.

발신자가 PGM 소켓을 만들어 멀티캐스트 주소에 연결하면 PGM 세션이 만들어집니다. 신뢰할 수 있는 멀티캐스트 세션은 GUID(Globally Unique Identifier)와 원본 포트의 조합으로 정의됩니다. 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 발신자는 각각 100바이트 버퍼를 사용하여 WSASend 함수를 세 번 호출합니다. 이 작업은 3개의 개별 PGM 패킷으로 와이어에 나타납니다. 수신기 쪽에서 WSARecv 함수에 대한 각 호출은 더 큰 수신 버퍼가 제공되더라도 100바이트만 반환합니다. 반면, 스트림 모드 PGM 발신자와 함께 3개의 100바이트 전송은 와이어에서 3개 미만의 실제 패킷으로 병합되거나 수신자 쪽의 데이터 Blob 하나로 병합될 수 있습니다. 따라서 수신기가 Windows 소켓 수신 함수 중 하나를 호출할 때 PGM 전송에서 받은 데이터의 양은 데이터가 물리적으로 전송되거나 수신된 방법에 관계없이 애플리케이션으로 반환될 수 있습니다.