다음을 통해 공유


CSocketFile 클래스

Windows 소켓을 통해 네트워크에서 데이터를 보내고 받는 데 사용되는 CFile 개체입니다.

구문

class CSocketFile : public CFile

멤버

공용 생성자

속성 설명
CSocketFile::CSocketFile CSocketFile 개체를 생성합니다.

설명

이 목적을 위해 개체를 개체에 CSocket 연결할 CSocketFile 수 있습니다. 또한 일반적으로 개체를 개체에 CSocketFile 연결하여 CArchive MFC serialization을 사용하여 데이터 전송 및 수신을 간소화할 수 있습니다.

데이터를 직렬화(보내기)하려면 데이터를 보관 파일에 삽입하여 멤버 함수를 호출 CSocketFile 하여 개체에 CSocket 데이터를 씁니다. 데이터를 역직렬화(수신)하려면 보관 파일에서 추출합니다. 이렇게 하면 보관에서 멤버 함수를 호출 CSocketFile 하여 개체에서 CSocket 데이터를 읽습니다.

여기에 설명된 대로 사용하는 CSocketFile 것 외에도 기본 클래스와 마찬가지로 독립 실행형 파일 개체로 CFile사용할 수 있습니다. 보관 기반 MFC serialization 함수와 함께 사용할 CSocketFile 수도 있습니다. CSocketFile 모든 CFile기능을 지원하지 않으므로 일부 기본 MFC serialize 함수는 호환CSocketFile되지 않습니다. 이는 특히 클래스의 경우입니다 CEditView . 대신 사용 하 여 CEditView::SerializeRaw개체에 연결 된 CSocketFile 개체를 CArchive 통해 데이터를 직렬화 CEditView 하려고 하지 말아야 CEditView::Serialize 합니다. 이 함수는 SerializeRaw 파일 개체에 없는 함수와 같은 Seek함수가 CSocketFile 있어야 합니다.

사용할 CArchiveCSocketFileCSocket때 요청된 바이트 양을 기다리는 루프(by)를 PumpMessages(FD_READ)입력하는 상황이 CSocket::Receive 발생할 수 있습니다. Windows 소켓은 FD_READ 알림당 하나의 recv 호출만 허용하지만 CSocketFileCSocket FD_READ당 여러 사각형 호출을 허용하기 때문입니다. 읽을 데이터가 없을 때 FD_READ 있으면 애플리케이션이 중단됩니다. 다른 FD_READ 얻지 못하면 애플리케이션이 소켓을 통해 통신을 중지합니다.

이 문제는 다음과 같이 해결할 수 있습니다. OnReceive 소켓 클래스의 메서드에서 소켓에서 읽을 예상 데이터가 하나의 TCP 패킷(네트워크 매체의 최대 전송 단위, 일반적으로 1096바이트 이상)의 크기를 초과할 때 메시지 클래스의 메서드를 호출하기 전에 호출 CAsyncSocket::IOCtl(FIONREAD, ...)Serialize 합니다. 사용 가능한 데이터의 크기가 필요 이상으로 작으면 모든 데이터가 수신될 때까지 기다린 다음 읽기 작업만 시작합니다.

다음 예제 m_dwExpected 에서는 사용자가 수신해야 하는 대략적인 바이트 수입니다. 코드의 다른 위치에서 선언한다고 가정합니다.

void CChatSocket::OnReceive(int nErrorCode)
{
   CSocket::OnReceive(nErrorCode);

   DWORD dwReceived;

   if (IOCtl(FIONREAD, &dwReceived))
   {
      if (dwReceived >= m_dwExpected) // Process only if you have enough data
         m_pDoc->ProcessPendingRead();
   }
   else
   {
      // Error handling here
   }
}

자세한 내용은 MFCWindows 소켓, Windows 소켓: 보관과 함께 소켓 사용 및 Windows 소켓 2 API를 참조하세요.

상속 계층 구조

CObject

CFile

CSocketFile

요구 사항

헤더: afxsock.h

CSocketFile::CSocketFile

CSocketFile 개체를 생성합니다.

explicit CSocketFile(
    CSocket* pSocket,
    BOOL bArchiveCompatible = TRUE);

매개 변수

pSocket
개체에 연결할 소켓입니다 CSocketFile .

bArchiveCompatible
파일 개체가 개체와 함께 CArchive 사용할지 여부를 지정합니다. 독립 실행 CFile 형 개체와 마찬가지로 독립 실행형 방식으로 개체를 사용 CSocketFile 하려는 경우에만 FALSE를 전달합니다( 특정 제한 사항). 이 플래그는 개체에 CArchive 연결된 개체가 읽기용 CSocketFile 버퍼를 관리하는 방법을 변경합니다.

설명

개체의 소멸자가 개체가 범위를 벗어나거나 삭제될 때 소켓 개체에서 자체 연결을 끊습니다.

참고 항목

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

"보관 호환" 모드에서 개체는 CSocketFile 더 나은 성능을 제공하고 "교착 상태"의 위험을 줄입니다. 송신 소켓과 수신 소켓이 서로 또는 공통 리소스를 대기할 때 교착 상태가 발생합니다. 개체가 CArchive 개체에서 CSocketFile 수행하는 방식으로 CFile 작동하는 경우 이 상황이 발생할 수 있습니다. 이 CFile경우 보관 파일은 요청된 바이트보다 적은 바이트를 받으면 파일 끝에 도달했다고 가정할 수 있습니다.

CSocketFile그러나 데이터는 메시지 기반이므로 버퍼에 여러 메시지가 포함될 수 있으므로 요청된 바이트 수보다 적게 수신해도 파일의 끝을 의미하지는 않습니다. 애플리케이션은 이 경우와 마찬가지로 CFile차단되지 않으며 버퍼가 비어 있을 때까지 버퍼에서 메시지를 계속 읽을 수 있습니다. CArchive::IsBufferEmpty 함수는 이러한 경우 보관 버퍼의 상태를 모니터링하는 데 유용합니다.

사용에 CSocketFile대한 자세한 내용은 Windows 소켓: 보관 및 Windows 소켓과 함께 소켓 사용: 보관을 사용하는 소켓 예제를 참조하세요.

참고 항목

CFile 클래스
계층 구조 차트
CAsyncSocket 클래스
CSocket 클래스