이 문서에서는 CSocket 개체, CSocketFile 개체 및 CArchive 개체를 결합하여 Windows 소켓을 통해 데이터를 보내고 받는 작업을 간소화하는 방법을 설명합니다.
Windows 소켓: 보관 파일을 사용하는 소켓의 예는 PacketSerialize
함수를 소개합니다. 예제의 PacketSerialize
보관 개체는 MFC Serialize 함수에 전달된 보관 개체와 매우 유사하게 작동합니다. 중요한 차이점은 소켓의 경우 보관이 표준 CFile 개체(일반적으로 디스크 파일과 연결됨)가 아니라 개체에 CSocketFile
연결된다는 것입니다.
CSocketFile
개체는 디스크 파일에 연결하는 대신 CSocket
개체에 연결합니다.
개체가 CArchive
버퍼를 관리합니다. 저장(전송) 보관의 버퍼가 가득 차면 연결된 CFile
개체가 버퍼의 내용을 씁니다. 소켓에 연결된 보관 파일의 버퍼를 플러시하는 것은 메시지를 보내는 것과 같습니다. 로드(수신) 보관의 버퍼가 가득 차면 CFile
객체가 버퍼를 다시 사용할 수 있을 때까지 읽기를 멈춥니다.
클래스 CSocketFile
는 파생CFile
되지만 위치 지정 함수(, , 등), 잠금 함수(Seek
, GetLength
SetLength
또는 LockRange
함수)와 같은 UnlockRange
멤버 함수를GetPosition
지원하지 않습니다.
CSocketFile 개체가 해야 할 일은 연결된 CSocket
개체에 대한 바이트 시퀀스를 쓰거나 읽는 것입니다. 파일이 관련되어 있지 않으므로 Seek
및 GetPosition
와 같은 작업들은 의미가 없습니다.
CSocketFile
는 파생되므로 CFile
일반적으로 이러한 멤버 함수를 모두 상속합니다. 이를 방지하기 위해 지원되지 않는 CFile
멤버 함수는 CSocketFile
에서 CNotSupportedException을 던지기 위해 재정의됩니다.
개체는 CSocketFile
해당 개체의 CSocket
멤버 함수를 호출하여 데이터를 보내거나 받습니다.
다음 그림에서는 통신의 양쪽에 있는 이러한 개체 간의 관계를 보여줍니다.
CArchive, CSocketFile 및 CSocket
이 명백한 복잡성의 목적은 소켓의 세부 사항을 직접 관리할 필요성으로부터 보호하는 것입니다. 소켓, 파일 및 보관 파일을 만든 다음 보관 파일에 삽입하거나 보관 파일에서 추출하여 데이터를 보내거나 받기 시작합니다. CArchive, CSocketFile 및 CSocket 은 백그라운드에서 세부 정보를 관리합니다.
CSocket
개체는 실제로 두 가지 상태 개체입니다. 때로는 비동기(일반적인 상태)이고 때로는 동기적일 수 있습니다. 비동기 상태에서 소켓은 프레임워크에서 비동기 알림을 받을 수 있습니다. 그러나 데이터 수신 또는 전송과 같은 작업 중에 소켓은 동기가 됩니다. 즉, 소켓은 동기 작업이 완료될 때까지 더 이상 비동기 알림을 받지 않습니다. 모드를 전환하므로 예를 들어 다음과 같은 작업을 수행할 수 있습니다.
void CMySocket::OnReceive(int nErrorCode)
{
if (0 == nErrorCode)
{
CSocketFile file(this);
CArchive ar(&file, CArchive::load);
CString str;
ar >> str;
}
}
2개 상태 개체로 구현되지 않은 경우 CSocket
이전 알림을 처리하는 동안 동일한 종류의 이벤트에 대한 추가 알림을 받을 수 있습니다. 예를 들어, OnReceive
을 처리할 때 OnReceive
알림을 받을 수 있습니다. 위 코드 조각에서, 아카이브에서 str
를 추출하면 재귀가 발생할 수 있습니다. 상태를 CSocket
전환하여 추가 알림을 방지하여 재귀를 방지합니다. 일반적인 규칙은 알림 안에 알림을 금지하는 것입니다.
비고
CSocketFile
는 CArchive
개체 없이도 제한적으로 파일로 사용할 수 있습니다. 기본적으로 CSocketFile
생성자의 bArchiveCompatible 매개 변수는 TRUE입니다. 이렇게 하면 파일 개체가 보관 파일과 함께 사용하도록 지정됩니다. 보관 파일 없이 파일 개체를 사용하려면 bArchiveCompatible 매개 변수에 FALSE를 전달합니다.
"보관 호환" 모드에서 개체는 CSocketFile
더 나은 성능을 제공하고 "교착 상태"의 위험을 줄입니다. 송신 소켓과 수신 소켓이 서로 대기하거나 공통 리소스를 기다리는 경우 교착 상태가 발생합니다. 이 상황은 CArchive
개체가 CSocketFile
개체와 같이 CFile
와 작업할 때 발생할 수 있습니다. 이 CFile
경우 보관 파일은 요청된 바이트보다 적은 바이트를 받으면 파일 끝에 도달했다고 가정할 수 있습니다.
CSocketFile
그러나 데이터는 메시지 기반이므로 버퍼에 여러 메시지가 포함될 수 있으므로 요청된 바이트 수보다 적게 수신해도 파일의 끝을 의미하지는 않습니다. 애플리케이션은 CFile
의 경우처럼 차단되지 않으며 버퍼가 비어 있을 때까지 버퍼에서 메시지를 계속 읽을 수 있습니다.
IsBufferEmpty 함수 CArchive
는 이러한 경우 보관 버퍼의 상태를 모니터링하는 데 유용합니다.
자세한 내용은 Windows 소켓: 아카이브와 함께 소켓 사용