다음을 통해 공유


Windows 소켓: 소켓 보관소를 작동 하는 방법

설명 어떻게는 CSocket 개체는 CSocketFile 개체와 CArchive 개체는 Windows 소켓을 통해 데이터를 송수신을 단순화 하기 위해 결합 되.

문서 Windows 소켓: 소켓을 사용 하 여 보관 파일 예제 제공의 PacketSerialize 함수.보관 개체에는 PacketSerialize 예제를 전달 하는 MFC 보관 개체 처럼 작동 Serialize 함수.소켓의 경우 보관 표준에 없습니다 연결 되어 있고 중요 한 차이점은 CFile 개체 (일반적으로 디스크 파일에 연결 됨) 하지만는 CSocketFile 개체입니다.디스크 파일에 연결 하는 대신에 CSocketFile 개체를 연결 하는 CSocket 개체입니다.

A CArchive 개체는 버퍼를 관리 합니다.버퍼에 저장 (송신) 보관의 꽉 찼을 때, 관련 CFile 개체 버퍼의 내용을 씁니다.버퍼를 플러시하는 소켓에 연결 된 보관 저장소의 메시지를 보내는 것과 같습니다.로드 (수신) 보관의 버퍼를 꽉 찰 때의 CFile 개체 버퍼를 다시 사용할 수 있을 때까지 읽기를 중지 합니다.

클래스 CSocketFile 에서 파생 됩니다 CFile, 하지만 지원 하지 않는 CFile 위치 함수 같은 멤버 함수 (Seek, GetLength, SetLength등), 잠금 기능 (LockRange, UnlockRange), 나는 GetPosition 함수.모든의 CSocketFile 개체가 수행 하는 쓰기 또는 읽기 관련에서 바이트 시퀀스입니다 CSocket 개체입니다.파일에 포함 되지 않습니다 때문에 같은 작업 SeekGetPosition 의미가 있습니다.CSocketFile파생 된 CFile, 일반적으로 이러한 멤버 함수 모두 상속 됩니다.이러한 지원 되지 않는 문제를 방지 하려면 CFile 멤버 함수에는 재정의 된 CSocketFile throw 하는 CNotSupportedException.

CSocketFile 개체의 함수 멤버를 호출 하는 CSocket 보내거나 받을 데이터 개체.

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

CArchive, CSocketFile 및 CSocket

CArchive CSocketFile CSocket

이렇게 복잡 한 이유 중 소켓의 세부 사항을 직접 관리할 필요가 없도록 보호 하기 위해서입니다.소켓, 파일 및 아카이브를 만들고 송신 또는 수신 데이터를 시작 하 여 보관 저장소에 삽입 하거나 아카이브를 추출 하 고 있습니다.CArchive, CSocketFile, 및 CSocket 이면에 숨겨진 세부 사항을 관리 합니다.

A CSocket 개체는 실제로 2-상태 개체입니다: 경우에 따라 비동기 (일반적인 상태) 동기.비동기 상태에서는 소켓은 프레임 워크의 비동기 알림을 받을 수 있습니다.그러나 데이터를 보내고 받을 하는 것과 같은 작업 도중 소켓이 동기 상태가 됩니다.동기 작업이 완료 될 때까지 소켓이 비동기 알림을 더 이상 받을 것을 의미 합니다.모드를 전환할 수 있으므로 예를 들어, 다음과 같이 구현할 수 있습니다:

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

      ar >> str;
   }
}

경우 CSocket 구현 되지 않음 2 가지 상태 개체로 이전 알림을 처리 하는 동안 같은 종류의 이벤트에 대 한 추가 알림의 받을 수도 있습니다.예를 들어, 가져올 수 있습니다는 OnReceive 알림을 처리 하는 동안에 OnReceive.위 코드 조각에서 추출 str 아카이브에서 재귀가 발생할 수 있습니다.상태를 전환 하 여 CSocket 추가 알림을 방지 함으로써 재귀를 방지 합니다.일반적인 규칙은 알림 내 알림입니다.

[!참고]

A CSocketFile (제한 된) 파일 없이 사용할 수 있는 CArchive 개체.기본적으로 CSocketFile 생성자의 bArchiveCompatible 매개 변수가 TRUE.이 파일 개체가 보관 대 임을 지정 합니다.전달 없이 아카이브 파일 개체를 사용 하려면 FALSE 에 있는 bArchiveCompatible 매개 변수.

해당 "보관 호환" 모드에서는 CSocketFile 개체 보다 나은 성능을 제공 하는 "교착 상태." 위험을 줄일 수 보내는 소켓과 받는 소켓이 서로 기다리는 중이거나 공용 리소스를 기다릴 때 교착 상태가 발생 합니다.경우에 이러한 상황이 발생할 수 있습니다는 CArchive 개체 작업에 CSocketFile 처럼 함께 CFile 개체입니다.함께 CFile, 아카이브는 요청한 것 보다 적은 바이트를 받으면 파일 끝에 도달 했습니다 가정할 수 있습니다.하지만 함께 CSocketFile, 데이터를 기반으로 합니다; 메시지입니다 요청한 바이트 수보다 적은 받을 파일의 끝을 의미 하지는 않습니다 있도록 버퍼에 여러 개의 메시지를 포함할 수 있습니다.응용 프로그램에 입장이 경우에는 차단 되지 않습니다 CFile, 버퍼가 빌 때까지 버퍼에서 메시지를 읽는 계속 될 수 있습니다.IsBufferEmpty 에서 작동 CArchive 이러한 경우 보관 파일의 버퍼의 상태를 모니터링 하는 데 유용 합니다.

자세한 내용은 Windows 소켓: 보관 파일을 사용 하 여 소켓

참고 항목

참조

CObject::Serialize

개념

Mfc에서 Windows 소켓