다음을 통해 공유


CSocket 수업

파생되고 CAsyncSocketWindows 소켓 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, ReceiveFromSendToAccept (모두 상속됨)는 CAsyncSocketCSocket오류를 반환 WSAEWOULDBLOCK 하지 않습니다. 대신 이러한 함수는 작업이 완료될 때까지 기다립니다. 또한 이러한 함수 중 하나가 차단되는 동안 호출되면 CancelBlockingCall 원래 호출이 WSAEINTR 오류로 종료됩니다.

개체를 CSocket 사용하려면 생성자를 호출한 다음 기본 핸들(형식SOCKET)을 만들기 위해 호출 Create 합니다SOCKET. 스트림 소켓을 만드는 기본 매개 변수 Create 이지만 개체와 함께 CArchive 소켓을 사용하지 않는 경우 대신 데이터그램 소켓을 만들 매개 변수를 지정하거나 특정 포트에 바인딩하여 서버 소켓을 만들 수 있습니다. 클라이언트 쪽 및 Accept 서버 쪽을 사용하여 Connect 클라이언트 소켓에 연결합니다. 그런 다음 개체를 CSocketFile 만들고 생성자의 개체에 CSocketFile 연결 CSocket 합니다. 다음으로 전송할 개체와 필요에 따라 데이터를 받기 위한 개체를 만든 CArchive 다음 생성자의 개체 CArchiveCSocketFile 연결합니다. 통신이 완료되면 , CSocketFileCSocket 개체를 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 기본 스레드에서만 호출됩니다.

자세한 내용은 MFCWindows 소켓, Windows 소켓: 보관 소켓과 함께 소켓 사용, Windows 소켓: 보관이 있는 소켓 작동 방법, Windows 소켓: 작업 시퀀스, Windows 소켓: 보관을 사용하는 소켓 예제를 참조하세요.

상속 계층 구조

CObject

CAsyncSocket

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 소켓: 보관과 함께 소켓 사용.을 참조 하세요.

참고 항목

CAsyncSocket 클래스
계층 구조 차트
CAsyncSocket 클래스
CSocketFile 클래스