Windows 소켓: 차단
이 문서 및 두 개의 참조 문서에서는 Windows 소켓 프로그래밍의 몇 가지 문제를 설명합니다. 이 문서는 차단에 대해 설명합니다. 다른 문제는 Windows 소켓: 바이트 순서 지정 및 Windows 소켓: 문자열 변환 문서에서 다룹니다.
CAsyncSocket 클래스를 사용하거나 파생하는 경우 이러한 문제를 직접 관리해야 합니다. CSocket 클래스를 사용하거나 파생하는 경우 MFC가 이를 관리합니다.
차단
소켓은 "차단 모드" 또는 "차단 안 함 모드"일 수 있습니다. 차단(또는 동기) 모드의 소켓 함수는 작업을 완료할 때까지 반환되지 않습니다. 이를 차단이라고 부르는 이유는 함수가 호출되는 소켓이 호출이 반환될 때까지 아무 것도 할 수 없이 차단되기 때문입니다. 예를 들어 멤버 함수에 Receive
대한 호출은 보내는 애플리케이션이 전송될 때까지 기다리는 동안 완료하는 데 임의로 오랜 시간이 걸릴 수 있습니다(사용 중이거나 차단을 사용하는 CAsyncSocket
경우CSocket
). CAsyncSocket
개체가 비블로킹 모드(비동기적으로 작동)인 경우 호출은 즉시 반환되고 GetLastError 멤버 함수를 사용하여 검색할 수 있는 현재 오류 코드는 WSAEWOULDBLOCK으로, 모드로 인해 즉시 반환되지 않았으면 호출이 차단되었을 것임을 나타냅니다. (CSocket
WSAEWOULDBLOCK을 반환하지 않습니다. 클래스는 차단을 관리합니다.)
32비트 및 64비트 운영 체제(예: Windows 95 또는 Windows 98)와 16비트 운영 체제(예: Windows 3.1)에서는 소켓의 동작이 달라집니다. 16비트 운영 체제와 달리 32비트 및 64비트 운영 체제는 선점형 멀티태스킹을 사용하며 다중 스레딩을 제공합니다. 32비트 및 64비트 운영 체제에서는 별개의 작업자 스레드에 소켓을 넣을 수 있습니다. 스레드에 있는 소켓은 애플리케이션의 다른 작업을 간섭하지 않고, 차단 시 컴퓨팅 시간을 소비하지 않고 차단할 수 있습니다. 다중 스레드 프로그래밍에 대한 자세한 내용은 다중 스레딩 문서를 참조하세요.
참고 항목
다중 스레드 애플리케이션에서는 CSocket
의 차단 특성을 사용해서 사용자 인터페이스의 응답성에 영향을 주지 않고 프로그램의 디자인을 간소화할 수 있습니다. 주 스레드에서 사용자 인터페이스를 처리하고 대체 스레드에서 CSocket
프로세싱을 처리함으로써 이러한 논리적 작업을 구분할 수 있습니다. 다중 스레드가 아닌 애플리케이션에서 이러한 두 작업은 서로 결합되어 단일 스레드로 처리되어야 합니다. 즉, 필요에 따라 통신 요청을 처리할 수 있도록 CAsyncSocket
을 사용하거나, 오래 걸리는 동기 작업 중에 사용자 작업을 처리할 수 있도록 CSocket::OnMessagePending
을 재정의합니다.
이 설명의 나머지 부분은 16비트 운영 체제를 대상으로 하는 프로그래머를 위한 것입니다.
일반적으로 CAsyncSocket
을 사용 중이면 차단 작업 사용을 피하고 대신 비동기적으로 작업을 수행해야 합니다. 비동기 작업에서 호출 Receive
후 WSAEWOULDBLOCK 오류 코드가 수신되는 시점부터 멤버 함수가 호출될 때까지 OnReceive
기다렸다가 다시 읽을 수 있음을 알립니다. 비동기 호출은 OnReceive와 같은 소켓의 적절한 콜백 알림 함수를 다시 호출하여 수행됩니다.
Windows에서 차단 호출은 좋지 않은 방법으로 고려됩니다. 기본적으로 CAsyncSocket 은 비동기 호출을 지원하며 콜백 알림을 사용하여 직접 차단을 관리해야 합니다. 반면에 CSocket 클래스는 동기적입니다. 이 클래스는 사용자를 위해 Windows 메시지를 제공하고 차단을 관리합니다.
차단에 대한 자세한 내용은 Windows Sockets 사양을 참조하십시오. "켜기 " 함수에 대한 자세한 내용은 Windows 소켓: 소켓 알림 및 Windows 소켓: 소켓 클래스에서 파생을 참조하세요.
자세한 내용은 다음을 참조하세요.