다음을 통해 공유


Windows 소켓: 소켓과 아카이브를 함께 사용하는 방법

이 문서에서는 CSocket 개체, CSocketFile 개체 및 CArchive 개체를 결합하여 Windows 소켓을 통해 데이터를 보내고 받는 작업을 간소화하는 방법을 설명합니다.

Windows 소켓: 보관을 사용하는 소켓의 예는 이 함수를 PacketSerialize 제공합니다. 예제의 PacketSerialize 보관 개체는 MFC Serialize 함수에 전달된 보관 개체와 매우 유사하게 작동합니다 . 중요한 차이점은 소켓의 경우 보관이 표준 CFile 개체(일반적으로 디스크 파일과 연결됨)가 아니라 개체에 CSocketFile 연결된다는 것입니다. 개체는 디스크 파일에 CSocketFile 연결하는 대신 개체에 CSocket 연결합니다.

개체가 CArchive 버퍼를 관리합니다. 저장(전송) 보관의 버퍼가 가득 차면 연결된 CFile 개체가 버퍼의 내용을 씁니다. 소켓에 연결된 보관 파일의 버퍼를 플러시하는 것은 메시지를 보내는 것과 같습니다. 로드(수신) 보관의 버퍼가 가득 차면 버퍼를 CFile 다시 사용할 수 있을 때까지 개체가 읽기를 중지합니다.

클래스 CSocketFile 는 파생CFile되지만 위치 지정 함수(, , SetLength등), 잠금 함수(Seek, GetLengthUnlockRange또는 GetPosition 함수)와 같은 CFile 멤버 함수를LockRange 지원하지 않습니다. CSocketFile 개체가 해야 할 일은 연결된 CSocket 개체에 대한 바이트 시퀀스를 쓰거나 읽는 것입니다. 파일이 관련되어 있지 않으므로 작업과 GetPosition 같은 Seek 작업은 의미가 없습니다. CSocketFile 는 파생되므로 CFile일반적으로 이러한 멤버 함수를 모두 상속합니다. 이를 방지하기 위해 지원 CFile 되지 않는 멤버 함수는 CNotSupportedExceptionthrow하기 위해 재정 CSocketFile 의됩니다.

개체는 CSocketFile 해당 개체의 CSocket 멤버 함수를 호출하여 데이터를 보내거나 받습니다.

다음 그림에서는 통신의 양쪽에 있는 이러한 개체 간의 관계를 보여줍니다.

CArchive, CSocketFile, and CSocket.
CArchive, CSocketFile 및 CSocket

이 명백한 복잡성의 목적은 소켓의 세부 사항을 직접 관리할 필요성으로부터 보호하는 것입니다. 소켓, 파일 및 보관 파일을 만든 다음 보관 파일에 삽입하거나 보관 파일에서 추출하여 데이터를 보내거나 받기 시작합니다. CArchive, CSocketFileCSocket 은 백그라운드에서 세부 정보를 관리합니다.

CSocket 개체는 실제로 두 가지 상태 개체입니다. 때로는 비동기(일반적인 상태)이고 때로는 동기적일 수 있습니다. 비동기 상태에서 소켓은 프레임워크에서 비동기 알림을 받을 수 있습니다. 그러나 데이터 수신 또는 전송과 같은 작업 중에 소켓은 동기가 됩니다. 즉, 소켓은 동기 작업이 완료될 때까지 더 이상 비동기 알림을 받지 않습니다. 모드를 전환하므로 예를 들어 다음과 같은 작업을 수행할 수 있습니다.

void CMySocket::OnReceive(int nErrorCode)
{
   if (0 == nErrorCode)
   {
      CSocketFile file(this);
      CArchive ar(&file, CArchive::load);
      CString str;

      ar >> str;
   }
}

2개 상태 개체로 구현되지 않은 경우 CSocket 이전 알림을 처리하는 동안 동일한 종류의 이벤트에 대한 추가 알림을 받을 수 있습니다. 예를 들어 .OnReceiveOnReceive 위의 코드 조각에서 보관 파일에서 추출 str 하면 재귀가 발생할 수 있습니다. 상태를 CSocket 전환하여 추가 알림을 방지하여 재귀를 방지합니다. 일반 규칙은 알림 내의 알림이 아닙니다.

참고 항목

A는 CSocketFile 개체 없이 (제한된) 파일로 사용할 수도 있습니다 CArchive . 기본적으로 CSocketFile 생성자의 bArchiveCompatible 매개 변수는 TRUE입니다. 이렇게 하면 파일 개체가 보관 파일과 함께 사용하도록 지정됩니다. 보관 파일 없이 파일 개체를 사용하려면 bArchiveCompatible 매개 변수에 FALSE전달합니다.

"보관 호환" 모드에서 개체는 CSocketFile 더 나은 성능을 제공하고 "교착 상태"의 위험을 줄입니다. 송신 소켓과 수신 소켓이 서로 대기하거나 공통 리소스를 기다리는 경우 교착 상태가 발생합니다. 개체가 CArchive 개체에서 CSocketFile 수행하는 방식으로 CFile 작동하는 경우 이 상황이 발생할 수 있습니다. 이 CFile경우 보관 파일은 요청된 바이트보다 적은 바이트를 받으면 파일 끝에 도달했다고 가정할 수 있습니다. CSocketFile그러나 데이터는 메시지 기반이므로 버퍼에 여러 메시지가 포함될 수 있으므로 요청된 바이트 수보다 적게 수신해도 파일의 끝을 의미하지는 않습니다. 애플리케이션은 이 경우와 마찬가지로 CFile차단되지 않으며 버퍼가 비어 있을 때까지 버퍼에서 메시지를 계속 읽을 수 있습니다. IsBufferEmpty 함수 CArchive이러한 경우 보관 버퍼의 상태를 모니터링하는 데 유용합니다.

자세한 내용은 Windows 소켓: 보관 파일과 함께 소켓 사용

참고 항목

MFC의 Windows 소켓
CObject::Serialize