다음을 통해 공유


PGM 데이터 보내기 및 받기

PGM 데이터를 보내고 받는 것은 모든 소켓에서 데이터를 보내거나 받는 것과 비슷합니다. 다음 단락에 설명된 PGM과 관련된 고려 사항이 있습니다.

PGM 데이터 보내기

PGM 발신자 세션이 만들어지면 보내기, sendto, WSASend 및 WSASendTo와 같은 다양한 Windows 소켓 보내기 함수를 사용하여 데이터가 전송됩니다. Windows 소켓 핸들은 파일 시스템 핸들이므로 WriteFile 및 CRT 함수와 같은 다른 함수도 데이터를 전송할 수 있습니다. 다음 코드 조각은 PGM 발신자 작업을 보여 줍니다.

LONG        error;
    //:
error = send (s, pSendBuffer, SendLength, 0);
if (error == SOCKET_ERROR)
{
    fprintf (stderr, "send() failed: Error = %d\n",
             WSAGetLastError());
}

메시지 모드(SOCK_RDM)를 사용하는 경우 송신 함수를 호출할 때마다 개별 메시지가 생성되며 경우에 따라 바람직하지 않을 수 있습니다. 애플리케이션은 여러 번의 호출로 2메가바이트 메시지를 보낼 수 있습니다. 이러한 상황에서 발신자는 RM_SET_MESSAGE_BOUNDARY 소켓 옵션을 설정하여 다음 메시지의 크기를 나타낼 수 있습니다.

보내기 창이 가득 차면 창이 고급 상태가 될 때까지 애플리케이션에서 새 보내기가 허용되지 않습니다. 비차단 소켓에서 전송을 시도하면 WSAEWOULDBLOCK으로 실패합니다. 차단 소켓은 창이 요청된 데이터를 버퍼링하고 보낼 수 있는 지점으로 이동될 때까지 차단합니다. 겹치는 I/O에서는 창이 새 데이터를 수용할 수 있을 만큼 앞으로 나아갈 때까지 작업이 완료되지 않습니다.

PGM 데이터 수신

PGM 수신기 세션이 만들어지면 다양한 Windows 소켓 수신 함수(recv, recvfrom, WSARecv 및 WSARecvFrom)를 사용하여 데이터를 받습니다. Windows 소켓 핸들도 파일 핸들이므로 ReadFile 및 CRT 함수를 사용하여 PGM 세션 데이터를 받을 수도 있습니다. 전송은 데이터가 시퀀스에 있는 한 도착하는 데이터를 수신자로 전달합니다. 전송은 반환된 데이터가 연속적이고 중복되지 않는다는 것을 보장합니다. 다음 코드 조각은 PGM 수신 작업을 보여 줍니다.

LONG        BytesRead;
    //:
BytesRead = recv (sockR, pTestBuffer, MaxBufferSize, 0);
if (BytesRead == 0)
{
    fprintf(stdout, "Session was terminated\n");
}
else if (BytesRead == SOCKET_ERROR)
{
    fprintf(stderr, "recv() failed: Error = %d\n",
            WSAGetLastError());
}

메시지 모드(SOCK_RDM)를 사용하는 경우 전송은 WSAEMSGSIZE 오류 또는 WSARecv 및 WSARecvFrom 함수에서 반환될 때 MSG_PARTIAL 플래그를 설정하여 부분 메시지가 수신되는 시기를 나타냅니다. 전체 메시지의 마지막 조각이 클라이언트에 반환되면 오류 또는 플래그가 표시되지 않습니다.

세션이 정상적으로 종료되면 WSAEDISCON으로 수신 작업이 실패합니다. 전송에서 데이터 손실이 발생하면 PGM은 일시적으로 시퀀스 외부 패킷을 버퍼링하고 손실된 데이터를 복구하려고 시도합니다. 데이터 손실을 복구할 수 없는 경우 수신 작업이 WSAECONNRESET으로 실패하고 세션이 종료됩니다. 다음을 포함하여 다양한 조건으로 인해 세션을 다시 설정할 수 있습니다.

  • 수신자 또는 들어오는 연결 속도가 너무 느려 들어오는 데이터 속도와 보조를 맞추지 않습니다.
  • 라우팅 문제, 네트워크 불안정 등과 같은 일시적인 네트워크 조건으로 인해 과도한 데이터 손실이 발생할 수 있습니다.
  • 보낸 사람에게 복구할 수 없는 오류가 발생합니다.
  • 허용되는 최대 내부 버퍼 스토리지를 초과하거나 리소스 부족 상태가 발생하는 등 로컬 컴퓨터에서 과도한 리소스 사용률이 발생합니다.
  • 데이터 일관성 검사 오류가 발생합니다.
  • 구성 요소 PGM의 오류는 TCP/IP 또는 Windows 소켓과 같은 에 따라 달라집니다.

위 목록의 첫 번째 항목과 두 번째 항목 모두 수신기가 리소스가 부족하기 전에 또는 궁극적으로 보낸 사람의 창을 벗어나기 전에 과도한 버퍼링을 수행할 수 있습니다.

PGM 세션 종료

PGM 발신자 또는 수신자는 closesocket을 호출하여 데이터 전송 또는 수신을 중지할 수 있습니다. 수신기는 핸들 누수 방지를 위해 수신 소켓과 수신 소켓 모두에서 closesocket 을 호출해야 합니다. closesocket을 호출하기 전에 보낸 사람에서 종료를 호출하면 모든 데이터가 전송되고 애플리케이션 자체가 종료되더라도 송신 창이 마지막 데이터 시퀀스를 지나도록 복구 데이터가 유지됩니다.