Share via


LPWSPCLOSESOCKET 콜백 함수(ws2spi.h)

LPWSPCloseSocket 함수는 소켓을 닫습니다.

구문

LPWSPCLOSESOCKET Lpwspclosesocket;

int Lpwspclosesocket(
  [in]  SOCKET s,
  [out] LPINT lpErrno
)
{...}

매개 변수

[in] s

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

[out] lpErrno

오류 코드에 대한 포인터입니다.

반환 값

오류가 발생하지 않으면 LPWSPCloseSocket 은 0을 반환합니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 lpErrno에서 특정 오류 코드를 사용할 수 있습니다.

오류 코드 의미
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEINPROGRESS
Windows 소켓 호출 차단이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEWOULDBLOCK
소켓은 차단 해제로 표시되고 SO_LINGER 0이 아닌 시간 제한 값으로 설정됩니다.

설명

이 함수는 소켓을 닫습니다. 보다 정확하게는 소켓 설명자를 해제하므로 WSAENOTSOCK 오류와 함께 대한 추가 참조가 실패해야 합니다. 기본 소켓에 대한 마지막 참조인 경우 연결된 명명 정보 및 큐에 대기 중인 데이터는 삭제됩니다. 소켓에서 보류 중인 차단 또는 비동기 호출(이 프로세스의 스레드에서 발급됨)은 알림 메시지를 게시하지 않고 취소됩니다. 이 프로세스의 스레드에서 발급된 보류 중인 겹치는 작업도 취소됩니다. 이러한 겹치는 작업에 대해 지정된 완료 작업이 수행됩니다(예: 이벤트, 완료 루틴 또는 완료 포트). 이 경우 겹치는 보류 중인 작업이 실패하고 오류 상태 WSA_OPERATION_ABORTED. LPWSPCloseSocket이 호출된 후에는 FD_CLOSE 게시되지 않습니다.

LPWSPCloseSocket 동작은 다음과 같이 요약됩니다.

  • SO_DONTLINGER 사용하도록 설정되면(기본 설정) LPWSPCloseSocket 이 즉시 반환되고 백그라운드에서 연결이 정상적으로 닫힙니다.

  • 시간 제한 0으로 SO_LINGER 사용하도록 설정하면 LPWSPCloseSocket 이 즉시 반환되고 연결이 다시 설정/종료됩니다.

    또는

  • 차단 소켓을 사용하여 0이 아닌 시간 제한으로 SO_LINGER 사용하도록 설정된 경우 LPWSPCloseSocket 은 모든 데이터가 전송되거나 제한 시간이 만료될 때까지 차단합니다.

  • 0이 아닌 소켓을 사용하여 0이 아닌 시간 제한으로 SO_LINGER 사용하도록 설정된 경우 LPWSPCloseSocket 은 즉시 반환되므로 실패를 나타냅니다.

LPWSPCloseSocket의 의미 체계는 다음과 같이 SO_LINGER 및 SO_DONTLINGER 소켓 옵션의 영향을 받습니다.

옵션 간격 닫기 유형 닫기를 기다리시나요?
SO_DONTLINGER 상관없어 정상 No
SO_LINGER 0 하드 No
SO_LINGER 0이 아닌 값 정상 Yes

 

 

SO_LINGER 설정되고(즉, 느린 구조의 l_onoff 멤버가 0이 아닌 경우) 시간 제한 간격 (l_linger)이 0이면 대기 중인 데이터가 아직 전송되거나 승인되지 않은 경우에도 LPWSPCloseSocket 이 차단되지 않습니다. 소켓의 가상 회로가 즉시 다시 설정되고 들여쓰지 않은 데이터가 손실되므로 이를 하드 또는 중단 닫기라고 합니다. 회로의 원격 쪽에서 LPWSPRecv 호출은 WSAECONNRESET으로 실패합니다.

차단 소켓에서 0이 아닌 시간 제한 간격으로 SO_LINGER 설정된 경우 LPWSPCloseSocket 호출은 나머지 데이터가 전송되거나 제한 시간이 만료될 때까지 차단 소켓에서 차단합니다. 이를 정상적인 연결 끊기라고 합니다. 모든 데이터가 전송되기 전에 제한 시간이 만료되면 서비스 공급자는 LPWSPCloseSocket 이 반환되기 전에 연결을 종료해야 합니다.

비 차단 소켓에서 0이 아닌 시간 제한 간격으로 SO_LINGER 사용하도록 설정하는 것은 권장되지 않습니다. 이 경우 닫기 작업을 즉시 완료할 수 없는 경우 LPWSPCloseSocket 에 대한 호출이 실패하고 WSAEWOULDBLOCK 오류가 발생합니다. WSAEWOULDBLOCK에서 LPWSPCloseSocket 이 실패하는 경우 소켓 핸들은 여전히 유효하며 연결 끊기가 시작되지 않습니다.

Winsock SPI 클라이언트는 LPWSPCloseSocket 을 다시 호출하여 소켓을 닫아야 하지만 Winsock SPI 클라이언트가 다음 중 하나를 수행하지 않는 한 LPWSPCloseSocket 은 계속 실패할 수 있습니다.

  • SO_DONTLINGER 사용하지 않도록 설정합니다.
  • 제한 시간이 0인 SO_LINGER 사용하도록 설정합니다.
  • LPWSPShutdown을 호출하여 닫기를 시작합니다.

SO_DONTLINGER 스트림 소켓에 설정된 경우(즉, 느린 구조의 l_onoff 멤버가 0임) LPWSPCloseSocket 호출은 즉시 반환되며 소켓이 차단 중이든 차단되지 않는지 여부에 관계없이 WSAEWOULDBLOCK을 받지 않습니다. 그러나 전송을 위해 대기 중인 모든 데이터는 기본 소켓을 닫기 전에 가능하면 전송됩니다. 이를 정상 연결 끊기라고 하며 기본 동작입니다.

이 경우 Winsock 공급자는 정상적인 연결 끊기가 완료되거나 공급자가 공급자가 결정한 시간 동안 작업을 완료할 수 없어 연결을 종료할 때까지 소켓과 연결된 모든 리소스를 유지할 수 있습니다. 이는 사용 가능한 모든 소켓을 사용할 것으로 예상되는 Winsock 클라이언트에 영향을 줄 수 있습니다. 기본 동작입니다. SO_DONTLINGER 기본적으로 설정됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
머리글 ws2spi.h

추가 정보

LPWSPAccept

LPWSPIoctl

WSPSetSockOpt

LPWSPSocket