closesocket 함수(winsock.h)

closesocket 함수는 기존 소켓을 닫습니다.

구문

int closesocket(
  [in] SOCKET s
);

매개 변수

[in] s

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

반환 값

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

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEINPROGRESS
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINTR
(차단) Windows Socket 1.1 호출이 WSACancelBlockingCall을 통해 취소되었습니다.
WSAEWOULDBLOCK
소켓은 차단 해제로 표시되지만, 느린 구조체의 l_onoff 멤버는 0이 아닌 값으로 설정되고, 느린 구조체의 l_linger 멤버는 0이 아닌 시간 제한 값으로 설정됩니다.

설명

closesocket 함수는 소켓을 닫습니다. s 매개 변수 에 전달된 소켓 설명자를 해제하는 데 사용합니다. s 매개 변수에 전달된 소켓 설명자는 closesocket 함수가 실행되는 즉시 시스템에서 즉시 다시 사용할 수 있습니다. 따라서 S 매개 변수에 전달된 소켓 설명자에 대한 추가 참조가 WSAENOTSOCK 오류와 함께 실패할 것으로 예상하는 것은 신뢰할 수 없습니다. Winsock 클라이언트는 다른 Winsock 함수 호출과 동시에 closesocket을 발급해서는 안 됩니다.

이 프로세스의 스레드에서 발행한 보류 중인 겹치는 송신 및 수신 작업(WSASend/ WSASendTo/ WSARecvWSARecvFrom/ 과 겹치는 소켓 포함)도 취소됩니다. 이러한 겹치는 작업에 대해 지정된 모든 이벤트, 완료 루틴 또는 완료 포트 작업이 수행됩니다. 겹치는 보류 중인 작업이 오류 상태 WSA_OPERATION_ABORTED 실패합니다.

애플리케이션은 closesocket 이 반환될 때 소켓의 미해결 I/O 작업이 모두 완료될 것이라고 가정해서는 안 됩니다. closesocket 함수는 미해결 I/O 작업에 대한 취소를 시작하지만, 그렇다고 해서 closesocket 함수가 반환될 때까지 애플리케이션이 이러한 I/O 작업에 대한 I/O 완료를 수신한다는 의미는 아닙니다. 따라서 애플리케이션은 I/O 요청이 실제로 완료될 때까지 미해결 I/O 요청에서 참조하는 리소스(예: WSAOVERLAPPED 구조)를 정리해서는 안 됩니다.

애플리케이션은 소켓 리소스를 시스템에 반환하기 위해 소켓을 성공적으로 호출할 때마다 항상 closesocket에 대한 일치 호출이 있어야 합니다.

느린 구조체는 데이터를 보낼 큐에 대기하고 closesocket 함수가 소켓에서 호출될 때 소켓이 작동하는 방식을 지정하는 특정 소켓에 대한 정보를 유지 관리합니다.

느린 구조체의 l_onoff 멤버는 큐에 대기된 데이터를 보낼 수 있도록 closesocket 함수 호출 후 지정된 시간 동안 소켓을 열어야 하는지 여부를 결정합니다. 이 멤버는 다음 두 가지 방법으로 수정할 수 있습니다.

  • optname 매개 변수를 SO_DONTLINGER 설정하여 setsockopt 함수를 호출합니다. optval 매개 변수는 l_onoff 멤버를 수정하는 방법을 결정합니다.
  • optname 매개 변수를 SO_LINGER 설정하여 setsockopt 함수를 호출합니다. optval 매개 변수는 l_onoff 멤버와 l_linger 멤버를 모두 수정하는 방법을 지정합니다.

느린 구조체의 l_linger 멤버는 소켓이 열린 상태로 유지되어야 하는 시간(초)을 결정합니다. 이 멤버는 느린 구조체의 l_onoff 멤버가 0이 아닌 경우에만 적용할 수 있습니다.

소켓의 기본 매개 변수는 느린 구조체의 l_onoff 멤버가 0이므로 소켓이 열린 상태로 유지되지 않아야 함을 나타냅니다. 느린 구조체의 l_linger 멤버에 대한 기본값은 0이지만 l_onoff 멤버가 0으로 설정된 경우 이 값은 무시됩니다.

소켓을 열린 상태로 유지하려면 애플리케이션에서 l_onoff 멤버를 0이 아닌 값으로 설정하고 l_linger 멤버를 원하는 시간 제한(초)으로 설정해야 합니다. 소켓을 열린 상태로 유지하지 않도록 설정하려면 애플리케이션에서 느린 구조체의 l_onoff 멤버만 0으로 설정하면 됩니다.

애플리케이션이 optname 매개 변수가 SO_DONTLINGER 설정된 setsockopt 함수를 호출하여 l_onoff 멤버를 0이 아닌 값으로 설정하는 경우 l_linger 멤버의 값이 지정되지 않습니다. 이 경우 사용되는 시간 제한은 구현에 따라 달라집니다. 소켓에 대해 이전 시간 제한이 설정된 경우(이전에 optname 매개 변수가 SO_LINGER 설정된 setsockopt 함수를 호출하여) 서비스 공급자가 이 시간 제한 값을 복원해야 합니다.

closesocket 함수의 의미 체계는 느린 구조체의 멤버를 설정하는 소켓 옵션의 영향을 받습니다.

l_onoff l_linger 닫기 유형 닫을 때까지 기다리시겠습니까?
0 상관없어 정상 닫기 No
0이 아닌 값 0 하드 No
0이 아닌 값 0이 아닌 값 모든 데이터가 l_linger 멤버에 지정된 시간 제한 값 내에서 전송되는 경우 정상입니다.

모든 데이터를 l_linger 멤버에 지정된 시간 제한 값 내에서 보낼 수 없는 경우 하드입니다.

Yes
 

LINGER 구조체의 l_onoff 멤버가 스트림 소켓에서 0이면 closesocket 호출이 즉시 반환되며 소켓이 차단 중인지 비블로킹인지에 관계없이 WSAEWOULDBLOCK을 수신하지 않습니다. 그러나 전송을 위해 대기 중인 모든 데이터는 가능하면 기본 소켓을 닫기 전에 전송됩니다. 이를 정상적인 연결 끊기 또는 닫기라고도 합니다. 이 경우 Windows 소켓 공급자는 임의의 기간 동안 소켓 및 기타 리소스를 해제할 수 없으므로 사용 가능한 모든 소켓을 사용해야 하는 애플리케이션에 영향을 줍니다. 소켓의 기본 동작입니다.

느린 구조체의 l_onoff 멤버가 0이 아니고 l_linger 멤버가 0이면 대기 중인 데이터가 아직 전송되거나 승인되지 않은 경우에도 closesocket이 차단되지 않습니다. 소켓의 가상 회로가 즉시 다시 설정되고 전송되지 않은 데이터가 손실되므로 이를 하드 또는 중단 닫기라고 합니다. Windows에서 회로의 원격 쪽에 있는 모든 recv 호출은 WSAECONNRESET으로 실패합니다.

느린 구조체의 l_onoff 멤버가 0이 아닌 값으로 설정되고 l_linger 멤버가 차단 소켓에서 0이 아닌 시간 제한으로 설정된 경우 나머지 데이터가 전송되거나 시간 제한이 만료될 때까지 closesocket 호출이 차단됩니다. 이는 모든 데이터가 l_linger 멤버에 지정된 시간 제한 값 내에 전송되는 경우 정상 연결 끊기 또는 닫기라고 합니다. 모든 데이터를 보내기 전에 시간 제한이 만료되면 Closesocket 이 반환되기 전에 Windows 소켓 구현이 연결을 종료하고 이를 하드 또는 중단 닫기라고 합니다.

느린 구조체의 l_onoff 멤버를 0이 아닌 0으로 설정하고 비블로킹 소켓에서 0이 아닌 시간 제한 간격으로 l_linger 멤버를 설정하지 않는 것이 좋습니다. 이 경우 close 작업을 즉시 완료할 수 없는 경우 closesocket 호출이 실패하고 WSAEWOULDBLOCK 오류가 발생합니다. WSAEWOULDBLOCK으로 closesocket이 실패하는 경우 소켓 핸들은 여전히 유효하며 연결 끊기가 시작되지 않습니다. 애플리케이션은 closesocket을 다시 호출하여 소켓을 닫아야 합니다.

느린 구조체의 l_onoff 멤버가 0이 아니고 l_linger 멤버가 차단 소켓에서 0이 아닌 시간 제한 간격인 경우 closesocket 함수의 결과를 사용하여 모든 데이터가 피어로 전송되었는지 여부를 확인할 수 없습니다. l_linger 멤버에 지정된 시간 제한이 만료되기 전에 데이터를 전송하거나 연결이 중단된 경우 closesocket 함수는 오류 코드를 반환하지 않습니다(closesocket 함수의 반환 값은 0임).

closesocket 호출은 모든 데이터가 피어에 전달되거나 시간 제한이 만료될 때까지만 차단됩니다. 시간 제한이 만료되어 연결이 다시 설정되면 소켓이 TIME_WAIT 상태로 전환되지 않습니다. 모든 데이터가 시간 제한 기간 내에 전송되면 소켓이 TIME_WAIT 상태로 전환할 수 있습니다.

느린 구조체의 l_onoff 멤버가 0이 아니고 l_linger 멤버가 차단 소켓에서 시간 제한 간격이 0이면 closesocket을 호출하면 연결이 다시 설정됩니다. 소켓이 TIME_WAIT 상태로 이동하지 않습니다.

getsockopt 함수는 optname 매개 변수를 SO_LINGER 설정하여 소켓과 연결된 느린 구조체의 현재 값을 검색하도록 호출할 수 있습니다.

참고 연결에서 모든 데이터가 전송되고 수신되도록 하려면 애플리케이션이 closesocket을 호출하기 전에 종료를 호출해야 합니다(자세한 내용은 정상 종료, 느린 옵션 및 소켓 닫기 참조). 또한 closesocket 이 호출된 후에는 FD_CLOSE 네트워크 이벤트가 게시되지 않습니다.
 

closesocket 동작에 대한 요약은 다음과 같습니다.

  • LINGER 구조체의 l_onoff 멤버가 0(소켓의 기본값)이면 closesocket이 즉시 반환되고 백그라운드에서 연결이 정상적으로 닫힙니다.
  • 느린 구조체의 l_onoff 멤버가 0이 아닌 값으로 설정되고 l_linger 멤버가 0(시간 제한 없음)으로 설정된 경우 closesocket은 즉시 반환되고 연결이 다시 설정되거나 종료됩니다.
  • 느린 구조체의 l_onoff 멤버가 0이 아닌 값으로 설정되고 l_linger 멤버가 0이 아닌 시간 제한으로 설정된 경우- 차단 소켓의 경우 모든 데이터가 전송되거나 시간 제한이 만료될 때까지 차단을 습니다.

    – 차단 해제 소켓의 경우 closesocket은 오류를 나타내는 즉시 를 반환합니다.

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

참고closesocket과 같은 차단 Winsock 호출을 실행할 때 Winsock은 호출이 완료되기 전에 네트워크 이벤트를 기다려야 할 수 있습니다. Winsock은 이 상황에서 경고 가능한 대기를 수행하며, 동일한 스레드에서 예약된 APC(비동기 프로시저 호출)에 의해 중단될 수 있습니다. 동일한 스레드에서 지속적인 차단 Winsock 호출을 중단한 APC 내에서 또 다른 차단 Winsock 호출을 실행하면 정의되지 않은 동작이 발생하며 Winsock 클라이언트에서 시도해서는 안 됩니다.
 

IrDA 소켓에 대한 참고 사항

다음 사항을 고려하세요.

  • Af_irda.h 헤더 파일은 명시적으로 포함되어야 합니다.
  • 표준 느린 옵션이 지원됩니다.
  • IrDA는 정상적인 닫기를 제공하지 않지만 수신 큐가 제거될 때까지 IrDA는 닫기를 연기합니다. 따라서 애플리케이션은 데이터를 보내고 소켓 함수를 즉시 호출할 수 있으며 수신자가 FD_CLOSE 메시지를 수신하기 전에 데이터를 복사할 것이라고 확신할 수 있습니다.

ATM에 대한 참고 사항

다음은 ATM(비동기 전송 모드) 및 Windows 소켓 2를 사용할 때 연결 해제와 관련된 중요한 문제입니다.

  • SD_SEND 또는 SD_BOTH closesocket 또는 shutdown 함수를 사용하면 제어 채널에서 RELEASE 신호가 전송됩니다. ATM이 별도의 신호 및 데이터 채널을 사용하기 때문에 릴리스 신호가 마지막 데이터가 대상에 도달하기 전에 원격 끝에 도달하여 해당 데이터가 손실될 수 있습니다. 한 가지 가능한 해결 방법은 보낸 마지막 데이터와 ATM 소켓에 대한 closesocket 또는 shutdown 함수 호출 간에 충분한 지연을 프로그래밍하는 것입니다.
  • 절반 가까이 ATM에서 지원되지 않습니다.
  • 중단 및 정상 연결 끊김으로 인해 동일한 원인 필드로 RELEASE 신호가 전송됩니다. 두 경우 모두 소켓의 원격 끝에 있는 수신된 데이터는 여전히 애플리케이션에 배달됩니다. 자세한 내용은 정상 종료, 느린 옵션 및 소켓 닫기 를 참조하세요.

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 포함)
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

정상 종료, 느린 옵션 및 소켓 닫기

WSAAsyncSelect

WSADuplicateSocket

WSAOVERLAPPED

Winsock 함수

Winsock 참조

받아들일

getsockopt

ioctlsocket

머무르게

setsockopt

socket