CSocket
수업
파생되고 CAsyncSocket
Windows 소켓 API의 캡슐화를 상속하며 개체보다 CAsyncSocket
높은 수준의 추상화를 나타냅니다.
구문
class CSocket : public CAsyncSocket
멤버
공용 생성자
속성 | 설명 |
---|---|
CSocket::CSocket |
CSocket 개체를 생성합니다. |
공용 메서드
이름 | 설명 |
---|---|
CSocket::Attach |
개체에 SOCKET 핸들을 CSocket 연결합니다. |
CSocket::CancelBlockingCall |
현재 진행 중인 차단 호출을 취소합니다. |
CSocket::Create |
소켓을 만듭니다. |
CSocket::FromHandle |
핸들이 지정된 개체에 대한 CSocket 포인터를 반환합니다 SOCKET . |
CSocket::IsBlocking |
차단 호출이 진행 중인지 여부를 확인합니다. |
보호된 메서드
속성 | 설명 |
---|---|
CSocket::OnMessagePending |
차단 호출이 완료되기를 기다리는 동안 보류 중인 메시지를 처리하기 위해 호출됩니다. |
설명
CSocket
는 클래스와 CSocketFile
함께 작동하며 CArchive
데이터의 송수신을 관리합니다.
또한 개체는 CSocket
.의 CArchive
동기 작업에 필수적인 차단 기능을 제공합니다. 차단 함수(예: Receive
, Send
, ReceiveFrom
SendTo
및 Accept
(모두 상속됨)는 CAsyncSocket
에 CSocket
오류를 반환 WSAEWOULDBLOCK
하지 않습니다. 대신 이러한 함수는 작업이 완료될 때까지 기다립니다. 또한 이러한 함수 중 하나가 차단되는 동안 호출되면 CancelBlockingCall
원래 호출이 WSAEINTR 오류로 종료됩니다.
개체를 CSocket
사용하려면 생성자를 호출한 다음 기본 핸들(형식SOCKET
)을 만들기 위해 호출 Create
합니다SOCKET
. 스트림 소켓을 만드는 기본 매개 변수 Create
이지만 개체와 함께 CArchive
소켓을 사용하지 않는 경우 대신 데이터그램 소켓을 만들 매개 변수를 지정하거나 특정 포트에 바인딩하여 서버 소켓을 만들 수 있습니다. 클라이언트 쪽 및 Accept
서버 쪽을 사용하여 Connect
클라이언트 소켓에 연결합니다. 그런 다음 개체를 CSocketFile
만들고 생성자의 개체에 CSocketFile
연결 CSocket
합니다. 다음으로 전송할 개체와 필요에 따라 데이터를 받기 위한 개체를 만든 CArchive
다음 생성자의 개체 CArchive
와 CSocketFile
연결합니다. 통신이 완료되면 , CSocketFile
및 CSocket
개체를 CArchive
삭제합니다. 데이터 형식은 SOCKET
Windows 소켓: 백그라운드 문서에 설명되어 있습니다.
사용할 CArchive
CSocketFile
CSocket
때 요청된 바이트 양을 기다리는 루프(by)를 PumpMessages(FD_READ)
입력하는 상황이 CSocket::Receive
발생할 수 있습니다. Windows 소켓은 알림당 FD_READ
하나의 recv 호출만 허용하지만 CSocket
CSocketFile
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 애플리케이션의 보조 스레드에서 MFC 소켓을 사용하는 경우 소켓을 사용하여 소켓 라이브러리를 초기화하는 각 스레드에서 호출 AfxSocketInit
해야 합니다. 기본적으로 AfxSocketInit
기본 스레드에서만 호출됩니다.
자세한 내용은 MFC의 Windows 소켓, Windows 소켓: 보관 소켓과 함께 소켓 사용, Windows 소켓: 보관이 있는 소켓 작동 방법, Windows 소켓: 작업 시퀀스, Windows 소켓: 보관을 사용하는 소켓 예제를 참조하세요.
상속 계층 구조
CSocket
요구 사항
머리글: afxsock.h
CSocket::Attach
개체에 핸들을 hSocket
연결하려면 이 멤버 함수를 CSocket
호출합니다.
BOOL Attach(SOCKET hSocket);
매개 변수
hSocket
소켓에 대한 핸들을 포함합니다.
Return Value
함수가 성공하는 경우 0이 아닙니다.
설명
SOCKET
핸들은 개체의 m_hSocket
데이터 멤버에 저장됩니다.
자세한 내용은 Windows 소켓: 보관과 함께 소켓 사용.을 참조 하세요.
예시
class CSockThread : public CWinThread
{
public:
SOCKET m_hConnected;
protected:
CChatSocket m_sConnected;
// remainder of class declaration omitted.
BOOL CSockThread::InitInstance()
{
// Attach the socket object to the socket handle
// in the context of this thread.
m_sConnected.Attach(m_hConnected);
m_hConnected = NULL;
return TRUE;
}
// This listening socket has been constructed
// in the primary thread.
void CListeningSocket::OnAccept(int nErrorCode)
{
UNREFERENCED_PARAMETER(nErrorCode);
// This CSocket object is used just temporarily
// to accept the incoming connection.
CSocket sConnected;
Accept(sConnected);
// Start the other thread.
CSockThread *pSockThread = (CSockThread*)AfxBeginThread(
RUNTIME_CLASS(CSockThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
if (NULL != pSockThread)
{
// Detach the newly accepted socket and save
// the SOCKET handle in our new thread object.
// After detaching it, it should no longer be
// used in the context of this thread.
pSockThread->m_hConnected = sConnected.Detach();
pSockThread->ResumeThread();
}
}
CSocket::CancelBlockingCall
현재 진행 중인 차단 호출을 취소하려면 이 멤버 함수를 호출합니다.
void CancelBlockingCall();
설명
이 함수는 이 소켓에 대한 미해결 차단 작업을 취소합니다. 원래 차단 호출은 오류 WSAEINTR
와 함께 가능한 한 빨리 종료됩니다.
차단 Connect
작업의 경우 Windows 소켓 구현은 가능한 한 빨리 차단 호출을 종료하지만 연결이 완료되거나 다시 설정되거나 시간이 초과될 때까지 소켓 리소스가 해제되지 않을 수 있습니다. 이는 애플리케이션이 새 소켓을 즉시 열려고 하거나(사용할 수 있는 소켓이 없는 경우) 동일한 피어에 연결하려는 경우에만 눈에 띄게 될 수 있습니다.
소켓을 확정되지 않은 상태로 둘 수 없는 작업을 Accept
취소합니다. 애플리케이션이 소켓에서 차단 작업을 취소하는 경우 다른 작업이 일부 Windows 소켓 구현에서 작동할 수 있지만 애플리케이션이 소켓에서 수행할 수 있는 작업에 따라 달라질 수 있는 유일한 작업은 호출 Close
입니다. 애플리케이션에 대한 최대 이식성을 원하는 경우 취소 후 작업 수행에 의존하지 않도록 주의해야 합니다.
자세한 내용은 Windows 소켓: 보관과 함께 소켓 사용.을 참조 하세요.
CSocket::Create
소켓 개체를 Create
생성한 후 멤버 함수를 호출하여 Windows 소켓을 만들고 연결합니다.
BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketAddress = NULL);
매개 변수
nSocketPort
소켓과 함께 사용할 특정 포트이거나 MFC에서 포트를 선택하려는 경우 0입니다.
nSocketType
SOCK_STREAM
또는 SOCK_DGRAM
.
lpszSocketAddress
연결된 소켓의 네트워크 주소를 포함하는 문자열에 대한 포인터로, 점선 번호(예: "128.56.22.8")입니다. 이 매개 변수에 대한 NULL 문자열을 전달하면 인스턴스가 CSocket
모든 네트워크 인터페이스에서 클라이언트 작업을 수신 대기해야 임을 나타냅니다.
Return Value
함수가 성공하면 0이 아닌 경우 그렇지 않으면 0이고, 호출 GetLastError
을 통해 특정 오류 코드를 검색할 수 있습니다.
설명
Create
를 호출 Bind
하여 소켓을 지정된 주소에 바인딩합니다. 지원되는 소켓 유형은 다음과 같습니다.
SOCK_STREAM
시퀀스된 신뢰할 수 있는 양방향 연결 기반 바이트 스트림을 제공합니다. 인터넷 주소 패밀리에 TCP(Transmission Control Protocol)를 사용합니다.SOCK_DGRAM
고정된(일반적으로 작은) 최대 길이의 연결되지 않고 신뢰할 수 없는 버퍼인 데이터그램을 지원합니다. 인터넷 주소 패밀리에 UDP(사용자 데이터그램 프로토콜)를 사용합니다. 이 옵션을 사용하려면 개체와 함께CArchive
소켓을 사용하면 안 됩니다.참고 항목
멤버 함수는
Accept
새 빈CSocket
개체를 해당 매개 변수로 참조합니다. 를 호출Accept
하기 전에 이 개체를 생성해야 합니다. 이 소켓 개체가 범위를 벗어나면 연결이 닫힙니다. 이 새 소켓 개체를 호출Create
하지 마세요.
스트림 및 데이터그램 소켓에 대한 자세한 내용은 Windows 소켓: 배경, Windows 소켓: 포트 및 소켓 주소 및 Windows 소켓: 보관 파일과 함께 소켓 사용 문서를 참조하세요.
CSocket::CSocket
CSocket
개체를 생성합니다.
CSocket();
설명
생성 후 멤버 함수를 Create
호출해야 합니다.
자세한 내용은 Windows 소켓: 보관과 함께 소켓 사용.을 참조 하세요.
CSocket::FromHandle
개체에 대한 포인터를 CSocket
반환합니다.
static CSocket* PASCAL FromHandle(SOCKET hSocket);
매개 변수
hSocket
소켓에 대한 핸들을 포함합니다.
Return Value
개체에 대한 CSocket
포인터이거나 NULL
개체가 연결되어 hSocket
있지 않은 CSocket
경우 .
설명
핸들이 SOCKET
지정되면 개체가 핸들에 연결되지 않은 경우 CSocket
멤버 함수는 임시 개체를 반환 NULL
하고 만들지 않습니다.
자세한 내용은 Windows 소켓: 보관과 함께 소켓 사용.을 참조 하세요.
CSocket::IsBlocking
차단 호출이 진행 중인지 확인하려면 이 멤버 함수를 호출합니다.
BOOL IsBlocking();
Return Value
소켓이 차단되는 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
자세한 내용은 Windows 소켓: 보관과 함께 소켓 사용.을 참조 하세요.
CSocket::OnMessagePending
Windows에서 특정 메시지를 찾고 소켓에서 응답하도록 이 멤버 함수를 재정의합니다.
virtual BOOL OnMessagePending();
Return Value
메시지가 처리된 경우 0이 아닌 경우 그렇지 않으면 0입니다.
설명
이는 고급 재정의 가능입니다.
소켓이 Windows 메시지를 펌핑하는 동안 프레임워크가 호출 OnMessagePending
하여 애플리케이션에 관심 있는 메시지를 처리할 수 있는 기회를 제공합니다. 사용할 OnMessagePending
수 있는 방법의 예제는 Windows 소켓: 소켓 클래스에서 파생되는 문서를 참조하세요.
자세한 내용은 Windows 소켓: 보관과 함께 소켓 사용.을 참조 하세요.