다음을 통해 공유


WSADuplicateSocketA 함수(winsock2.h)

WSADuplicateSocket 함수는 공유 소켓에 대한 새 소켓 설명자를 만드는 데 사용할 수 있는 WSAPROTOCOL_INFO 구조를 반환합니다. WSADuplicateSocket 함수는 QOS 사용 소켓에서 사용할 수 없습니다.

구문

int WSAAPI WSADuplicateSocketA(
  [in]  SOCKET              s,
  [in]  DWORD               dwProcessId,
  [out] LPWSAPROTOCOL_INFOA lpProtocolInfo
);

매개 변수

[in] s

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

[in] dwProcessId

중복된 소켓을 사용할 대상 프로세스의 프로세스 식별자입니다.

[out] lpProtocolInfo

WSAPROTOCOL_INFO 구조를 포함 할 수 있을 만큼 큰 버퍼에 대한 포인터입니다. 서비스 공급자는 프로토콜 정보 구조 콘텐츠를 이 버퍼에 복사합니다.

반환 값

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

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEINVAL
지정된 매개 변수 중 하나가 잘못되었음을 나타냅니다.
WSAEINPROGRESS
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEMFILE
더 이상 소켓 설명자를 사용할 수 없습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다. 소켓을 만들 수 없습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEFAULT
lpProtocolInfo 매개 변수가 사용자 주소 공간의 유효한 부분이 아닙니다.

설명

WSADuplicateSocket 함수는 프로세스 간에 소켓 공유를 사용하도록 설정하는 데 사용됩니다. 원본 프로세스는 WSADuplicateSocket 을 호출하여 특수 WSAPROTOCOL_INFO 구조를 가져옵니다. 일부 IPC(Interprocess Communications) 메커니즘을 사용하여 이 구조체의 내용을 대상 프로세스에 전달합니다. 그러면 WSASocket 을 호출하여 중복된 소켓에 대한 설명자를 가져옵니다. 특수 WSAPROTOCOL_INFO 구조체는 대상 프로세스에서 한 번만 사용할 수 있습니다.

소켓 설명자는 프로세스의 모든 스레드에서 유효하기 때문에 WSADuplicateSocket 함수를 사용하지 않고 지정된 프로세스의 스레드 간에 소켓을 공유할 수 있습니다.

다음 표에서는 공유 소켓을 설정하고 전달하기 위한 한 가지 시나리오를 설명합니다.

원본 프로세스 IPC 대상 프로세스
1) WSASocket, WSAConnect
2) 대상 프로세스 식별자 요청 ==>
3) 프로세스 식별자 요청 수신 및 응답
4) 수신 프로세스 식별자 <==
5) WSADuplicateSocket 을 호출하여 특수 WSAPROTOCOL_INFO 구조 가져오기
6) 대상 에 WSAPROTOCOL_INFO 구조 보내기
==> 7) 수신 WSAPROTOCOL_INFO 구조
8) WSASocket 을 호출하여 공유 소켓 설명자를 만듭니다.
9) 데이터 교환에 공유 소켓 사용
10) closesocket <==
 

공유 소켓을 참조하는 설명자는 I/O에 대해 독립적으로 사용할 수 있습니다. 그러나 Windows 소켓 인터페이스는 모든 유형의 액세스 제어를 구현하지 않으므로 공유 소켓에서 작업을 조정하는 것은 관련된 프로세스에 달려 있습니다. 공유 소켓은 일반적으로 소켓을 만들고 연결을 설정하는 프로세스와 정보 교환을 담당하는 다른 프로세스를 갖는 데 사용됩니다.

소켓 설명자가 실제 소켓이 아닌 중복되므로 소켓과 연결된 모든 상태 정보는 모든 설명자에서 공통적으로 유지됩니다. 예를 들어 설명자 하나를 사용하여 수행된 setsockopt 작업은 이후 또는 모든 설명자의 getsockopt 를 사용하여 표시됩니다. 원본 프로세스와 대상 프로세스 모두 동일한 플래그를 해당 WSASocket 함수 호출에 전달해야 합니다. 원본 프로세스에서 소켓 함수를 사용하여 소켓 을 만드는 경우 대상 프로세스는 WSA_FLAG_OVERLAPPED 플래그를 WSASocket 함수 호출에 전달해야 합니다. 프로세스는 중복된 소켓에서 closesocket 을 호출할 수 있으며 설명자가 할당 취소됩니다. 그러나 마지막 남은 설명자가 closesocket을 호출할 때까지 기본 소켓은 열린 상태로 유지됩니다.

공유 소켓에 대한 알림에는 WSAAsyncSelect 및 WSAEventSelect 의 일반적인 제약 조건이 적용 됩니다. 공유 설명자를 사용하여 이러한 호출 중 하나를 실행하면 해당 등록에 사용된 설명자에 관계없이 소켓에 대한 이전 이벤트 등록이 취소됩니다. 따라서 공유 소켓은 A를 처리하고 B를 처리하도록 이벤트를 FD_WRITE FD_READ 이벤트를 제공할 수 없습니다. 이러한 긴밀한 조정이 필요한 경우 개발자는 별도의 프로세스 대신 스레드를 사용하는 것이 좋습니다.

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

참고

winsock2.h 헤더는 WSADuplicateSocket을 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

   
지원되는 최소 클라이언트 Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winsock2.h
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

WSASocket

Winsock 함수

Winsock 참조