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
있어야 합니다.
사용할 CArchive
CSocketFile
CSocket
때 요청된 바이트 양을 기다리는 루프(by)를 PumpMessages(FD_READ)
입력하는 상황이 CSocket::Receive
발생할 수 있습니다. Windows 소켓은 FD_READ 알림당 하나의 recv 호출만 허용하지만 CSocketFile
CSocket
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
}
}
자세한 내용은 MFC의 Windows 소켓, Windows 소켓: 보관과 함께 소켓 사용 및 Windows 소켓 2 API를 참조하세요.
상속 계층 구조
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 소켓과 함께 소켓 사용: 보관을 사용하는 소켓 예제를 참조하세요.