다음을 통해 공유


shutdown 함수(winsock.h)

종료 함수는 소켓에서 전송 또는 수신을 사용하지 않도록 설정합니다.

구문

int shutdown(
  [in] SOCKET s,
  [in] int    how
);

매개 변수

[in] s

소켓을 식별하는 설명자입니다.

[in] how

더 이상 허용되지 않는 작업 유형을 설명하는 플래그입니다. 이 플래그에 사용할 수 있는 값은 Winsock2.h 헤더 파일에 나열됩니다.

의미
SD_RECEIVE
0
수신 작업을 종료합니다.
SD_SEND
1
보내기 작업을 종료합니다.
SD_BOTH
2
보내기 및 받기 작업을 모두 종료합니다.

반환 값

오류가 발생하지 않으면 종료 는 0을 반환합니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSAECONNABORTED
가상 회로가 시간 초과 또는 기타 오류로 인해 종료되었습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다.

이 오류는 연결 지향 소켓에만 적용됩니다.

WSAECONNRESET
가상 회로가 하드 또는 중단한 닫기를 실행하는 원격 쪽에서 재설정되었습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다.

이 오류는 연결 지향 소켓에만 적용됩니다.

WSAEINPROGRESS
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINVAL
매개 변수가 유효하지 않거나 소켓 형식과 일치하지 않는 방법입니다 . 예를 들어 SD_SEND UNI_RECV 소켓 유형과 함께 사용됩니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAENOTCONN
소켓이 연결되지 않았습니다. 이 오류는 연결 지향 소켓에만 적용됩니다.
WSAENOTSOCK
참고 설명자가 소켓이 아닙니다.
 
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.

설명

종료 함수는 수신, 전송 또는 둘 다를 사용하지 않도록 설정하기 위해 모든 유형의 소켓에서 사용됩니다.

매개 변수가 SD_RECEIVE 경우 소켓의 recv 함수에 대한 후속 호출은 허용되지 않습니다. 이는 낮은 프로토콜 계층에 영향을 주지 않습니다. TCP 소켓의 경우 수신 대기 중인 소켓에 대기 중인 데이터가 여전히 있거나 이후에 데이터가 도착하는 경우 데이터를 사용자에게 전달할 수 없으므로 연결이 다시 설정됩니다. UDP 소켓의 경우 들어오는 데이터그램이 허용되고 큐에 대기됩니다. 어떤 경우에도 ICMP 오류 패킷이 생성되지 않습니다.

매개 변수가 SD_SEND 경우 send 함수에 대한 후속 호출은 허용되지 않습니다. TCP 소켓의 경우 수신자가 모든 데이터를 보내고 승인한 후 FIN이 전송됩니다.

SD_BOTH 방법을 설정하면 위에서 설명한 대로 송신과 수신을 모두 사용하지 않도록 설정합니다.

종료 함수는 소켓을 닫지 않습니다. closesocket이 호출될 때까지 소켓에 연결된 모든 리소스는 해제되지 않습니다.

모든 데이터가 닫히기 전에 연결된 소켓에서 전송되고 수신되도록 하려면 애플리케이션은 closesocket을 호출하기 전에 종료를 사용하여 연결을 닫아야 합니다. 원격 엔드가 모든 데이터를 보내고 정상 연결 끊기를 시작했음을 알리는 알림을 기다리는 한 메서드는 다음과 같이 WSAEventSelect 함수를 사용합니다.

  1. WSAEventSelect를 호출하여 FD_CLOSE 알림에 등록합니다.
  2. how=SD_SEND 사용하여 종료를 호출합니다.
  3. FD_CLOSE 받으면 함수가 성공적으로 완료되고 0바이트가 수신되었음을 나타내기 전까지 recv 또는 WSARecv 를 호출합니다. SOCKET_ERROR 반환되면 정상적인 연결 끊기를 사용할 수 없습니다.
  4. closesocket을 호출합니다.
원격 엔드가 모든 데이터를 보내고 정상적인 연결 끊기를 시작했음을 알리는 알림을 기다리는 또 다른 메서드는 겹치는 수신 호출을 사용합니다.
  1. how=SD_SEND 사용하여 종료를 호출합니다.
  2. 함수가 성공으로 완료되고 0바이트가 수신되었음을 나타내기 전까지 recv 또는 WSARecv 를 호출합니다. SOCKET_ERROR 반환되면 정상적인 연결 끊기를 사용할 수 없습니다.
  3. closesocket을 호출합니다.
참고종료 함수는 소켓의 SO_LINGER 설정에 관계없이 차단되지 않습니다.
 

자세한 내용은 정상 종료, 느린 옵션 및 소켓 닫기 섹션을 참조하세요.

보내기, 받기 또는 둘 다를 사용하지 않도록 설정하기 위해 종료 함수가 호출되면 기존 소켓 연결에 대해 보내기 또는 받기를 다시 사용하도록 설정하는 방법이 없습니다.

애플리케이션이 종료된 후 소켓을 다시 사용할 수 있는 것에 의존해서는 안 됩니다. 특히 Windows 소켓 공급자는 종료된 소켓에서 의 연결 사용을 지원할 필요가 없습니다.

애플리케이션이 소켓을 다시 사용하려는 경우 dwFlags 매개 변수를 TF_REUSE_SOCKET 설정된 DisconnectEx 함수를 호출하여 소켓의 연결을 닫고 다시 사용할 소켓 핸들을 준비해야 합니다. DisconnectEx 요청이 완료되면 소켓 핸들을 AcceptEx 또는 ConnectEx 함수에 전달할 수 있습니다.

애플리케이션이 소켓을 다시 사용하려는 경우 dwFlags 매개 변수 집합과 함께 TF_DISCONNECT 및 TF_REUSE_SOCKET 사용하여 모든 데이터가 전송을 위해 큐에 대기하고 소켓 핸들을 다시 사용할 수 있도록 준비한 후 연결을 끊을 수 있습니다. TransmitFile 요청이 완료되면 소켓 핸들을 이전에 AcceptEx 또는 ConnectEx와 같은 연결을 설정하는 데 사용된 함수 호출에 전달할 수 있습니다. TransmitPackets 함수가 완료되면 소켓 핸들을 AcceptEx 함수에 전달할 수 있습니다.

참고 소켓 수준 연결 끊기는 기본 전송의 동작이 적용됩니다. 예를 들어 TCP 소켓에는 TCP TIME_WAIT 상태가 적용되어 DisconnectEx, TransmitFile 또는 TransmitPackets 호출이 지연될 수 있습니다.
 
참고종료와 같은 차단 Winsock 호출을 실행할 때 Winsock은 호출이 완료되기 전에 네트워크 이벤트를 기다려야 할 수 있습니다. Winsock은 이 상황에서 경고 가능한 대기를 수행합니다. 이 대기는 동일한 스레드에서 예약된 APC(비동기 프로시저 호출)에 의해 중단될 수 있습니다. 동일한 스레드에서 지속적인 차단 Winsock 호출을 중단한 APC 내에서 다른 차단 Winsock 호출을 실행하면 정의되지 않은 동작이 발생하며 Winsock 클라이언트에서 시도해서는 안 됩니다.
 

ATM에 대한 참고 사항

ATM(비동기 전송 모드) 및 Windows 소켓 2를 사용할 때 연결 해제와 관련된 중요한 문제가 있습니다. 이러한 중요한 고려 사항에 대한 자세한 내용은 closesocket 함수 참조의 주의 섹션에서 ATM에 대한 참고 섹션을 참조하세요.

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

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

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winsock.h(Winsock2.h, Webhost.h 포함)
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

AcceptEx

ConnectEx

DisconnectEx

TransmitFile

TransmitPackets

WSAEventSelect

Winsock 함수

Winsock 참조

connect

socket