다음을 통해 공유


LPFN_DISCONNECTEX 콜백 함수(mswsock.h)

DisconnectEx 함수는 소켓의 연결을 닫고 소켓 핸들을 다시 사용할 수 있도록 합니다.

참고

이 함수는 Windows 소켓 사양에 대한 Microsoft 전용 확장입니다.

구문

LPFN_DISCONNECTEX LpfnDisconnectex;

BOOL LpfnDisconnectex(
  SOCKET s,
  LPOVERLAPPED lpOverlapped,
  DWORD dwFlags,
  DWORD dwReserved
)
{...}

매개 변수

s

연결된 연결 지향 소켓에 대한 핸들입니다.

lpOverlapped

OVERLAPPED 구조에 대한 포인터입니다. 소켓 핸들이 겹치는 것으로 열린 경우 이 매개 변수를 지정하면 겹치는(비동기) I/O 작업이 발생합니다.

dwFlags

함수 호출 처리를 사용자 지정하는 플래그 집합입니다. 이 매개 변수를 0으로 설정하면 플래그가 설정되지 않습니다. dwFlags 매개 변수에는 다음 값이 있을 수 있습니다.

플래그 의미
TF_REUSE_SOCKET 다시 사용할 소켓 핸들을 준비합니다. DisconnectEx 요청이 완료되면 소켓 핸들을 AcceptEx 또는 ConnectEx 함수에 전달할 수 있습니다.
참고: 소켓 수준 연결 끊기는 기본 전송의 동작이 적용됩니다. 예를 들어 TCP 소켓에는 TCP TIME_WAIT 상태가 적용되어 DisconnectEx 호출이 지연될 수 있습니다.

dwReserved

예약되어 있습니다. 0이어야 합니다. 0이 아닌 경우 WSAEINVAL 이 반환됩니다.

반환 값

성공하면 DisconnectEx 함수는 TRUE를 반환 합니다. 실패 시 함수는 FALSE를 반환 합니다. WSAGetLastError 함수를 사용하여 확장된 오류 정보를 가져옵니다. WSAGetLastError 함수에 대한 호출이 ERROR_IO_PENDING 반환하면 작업이 성공적으로 시작되고 진행 중입니다. 이러한 상황에서 작업이 완료되면 호출이 여전히 실패할 수 있습니다.

오류 코드 Description
WSAEFAULT 시스템에서 포인터 인수를 사용하려고 할 때 잘못된 포인터 주소를 검색했습니다. 이 오류는 lpOverlapped 매개 변수에 잘못된 포인터 값이 전달된 경우 반환됩니다.
WSAEINVAL 잘못된 매개 변수가 전달되었습니다. dwFlags 매개 변수가 TF_REUSE_SOCKET 이외의 값으로 지정된 경우 이 오류가 반환됩니다.
WSAENOTCONN 소켓이 연결되지 않았습니다. 소켓 매개 변수가 연결된 상태가 아닌 경우 이 오류가 반환됩니다. 소켓이 이전 요청의 전송 닫기 상태에 있고 dwFlags 매개 변수가 소켓 재사용을 요청하기 위해 TF_REUSE_SOCKET 설정되지 않은 경우에도 이 오류가 반환될 수 있습니다.

설명

DisconnectEx 함수는 데이터그램 소켓을 지원하지 않습니다. 따라서 hSocket 에 지정된 소켓은 SOCK_STREAM, SOCK_SEQPACKET 또는 SOCK_RDM 소켓과 같은 연결 지향적이어야 합니다.

참고

DisconnectEx 함수에 대한 함수 포인터는 지정된 SIO_GET_EXTENSION_FUNCTION_POINTER opcode를 사용하여 WSAIoctl 함수를 호출하여 런타임에 가져와야 합니다. WSAIoctl 함수에 전달된 입력 버퍼에는 값이 DisconnectEx 확장 함수를 식별하는 GUID(Globally Unique Identifier)인 WSAID_DISCONNECTEX 포함되어야 합니다. 성공하면 WSAIoctl 함수에서 반환된 출력에 DisconnectEx 함수에 대한 포인터가 포함됩니다. WSAID_DISCONNECTEX GUID는 Mswsock.h 헤더 파일에 정의되어 있습니다.

lpOverlappedNULL이 아닌 경우 DisconnectEx가 반환되기 전에 겹치는 I/O가 완료되지 않을 수 있으므로 DisconnectEx 함수는 FALSE를 반환하고 WSAGetLastError 함수를 호출하여 ERROR_IO_PENDING 반환합니다. 이 디자인을 사용하면 연결 끊기 작업이 완료되는 동안 호출자가 처리를 계속할 수 있습니다. 요청이 완료되면 Windows는 OVERLAPPED 구조체의 hEvent 멤버에 의해 지정된 이벤트 또는 hSocket으로 지정된 소켓을 신호 상태로 설정합니다.

참고

지정된 스레드에서 시작된 모든 I/O는 해당 스레드가 종료될 때 취소됩니다. 겹치는 소켓의 경우 작업이 완료되기 전에 스레드가 닫히면 보류 중인 비동기 작업이 실패할 수 있습니다. 자세한 내용은 ExitThread 를 참조하세요.

TIME_WAIT 상태는 TCP가 닫힌 연결을 해제하고 해당 리소스를 재사용하기 전에 경과해야 하는 시간을 결정합니다. 클로저와 릴리스 사이의 이 간격을 TIME_WAIT 상태 또는 2MSL 상태라고 합니다. 이 시간 동안 새 연결을 설정하는 것보다 클라이언트 및 서버에 대한 훨씬 적은 비용으로 연결을 다시 열 수 있습니다. TIME_WAIT 동작은 RFC 793 에 지정되어 TCP가 네트워크의 최대 세그먼트 수명(MSL)의 두 배 이상인 간격 동안 닫힌 연결을 유지 관리해야 합니다. 연결이 해제되면 소켓에 사용되는 소켓 쌍 및 내부 리소스를 사용하여 다른 연결을 지원할 수 있습니다.

Windows TCP는 연결이 닫히고 TIME_WAIT 상태로 되돌아갑니다. TIME_WAIT 상태에서는 소켓 쌍을 다시 사용할 수 없습니다. TIME_WAIT 기간은 TIME_WAIT 기간을 초 단위로 나타내는 다음 DWORD 레지스트리 설정을 수정하여 구성할 수 있습니다.

Hkey_local_machine\시스템\CurrentControlSet\서비스\Tcpip\매개 변수\TcpTimedWaitDelay

기본적으로 MSL은 120초로 정의됩니다. TcpTimedWaitDelay 레지스트리 설정은 기본적으로 240초 값으로 설정되며, 이는 최대 세그먼트 수명 120초 또는 4분의 2배를 나타냅니다. 그러나 이 항목을 사용하여 간격을 사용자 지정할 수 있습니다. 이 항목의 값을 줄이면 TCP가 닫힌 연결을 더 빠르게 해제하여 새 연결에 더 많은 리소스를 제공할 수 있습니다. 그러나 값이 너무 낮으면 연결이 완료되기 전에 TCP에서 연결 리소스를 해제할 수 있으므로 서버에서 추가 리소스를 사용하여 연결을 다시 설정해야 합니다. 이 레지스트리 설정은 0초에서 300초까지 설정할 수 있습니다.

Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.

Windows 8.1Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.

요구 사항

요구 사항
헤더 mswsock.h