BLOG main image
분류 전체보기 (192)
Network Pr. (88)
Multimedia Pr. (0)
Game Pr. (83)
Windows GUI Pr. (0)
Windows Shell Pr. (0)
Design Pattern (0)
Tiny Clinet (Engine) (0)
Scrap (6)
1'st Life (5)
2'nd Life (8)
Secrete Zone (1)
Free Zone (1)
1top-list.ru
1top-list.ru
John Travolta
icoder's storage - WSANtohl
california
california
ชุดผ้าปูที่นอน
ชุดผ้าปูที่นอน
tips cara agar blog tampil pad..
tips cara agar blog tampil pad..
1,169,156 Visitors up to today!
Today 15 hit, Yesterday 8 hit
daisy rss
tistory 티스토리 가입하기!
2007. 1. 7. 01:23

WSADuplicateSocket

WSADuplicateSocket 함수는 공유소켓에 대한 새로운 소켓 기술자를 생성하는데 사용될 수 있는 WSAPROTOCOL_INFO 구조체를 반환하는 함수 입니다.

int WSADuplicateSocket (
        SOCKET  
s,
        DWORD  
dwProcessId,
        LPWSAPROTOCOL_INFO  
lpProtocolInfo
);


Parameters

s
[입력] 로컬소켓을 구분짖는 기술자

dwProcessId
[입력] 복제된 소켓이 사용될 타겟 프로세스의 프로세스 아이디

lpProtocolInfo
[출력]
WSAPROTOCOL_INFO 구조체를 담기위해 충분한 크기를 가진 클라이언트에서 할당되 버퍼의 포인터입니다. 서비스 프로바이더는 이 버퍼에 프로토콜 정보를 카피합니다.


Remarks

WSADuplicateSocket 함수는 프로세스 간에 소켓을 공유하는데 사용되는 함수입니다. 원본 프로세스는 WSADuplicateSocket 함수를 호출해서 특별한 WSAPROTOCOL_INFO 구조체를 얻어냅니다. 이 구조체는 목적지 프로세스로 이 구조체의 내용을 넘기기 위해 프로세스 상호간의 통신(IPC) 매커니즘을 사용합니다. 구조체의 내용을 받은 프로세스는 WSASocket 함수를 사용하여 소켓을 복제하기위해 소켓 기술자를 얻어냅니다. 이 WSAPROTOCOL_INFO 구조체는 타겟 프로세스에서 단 한번만 사용될 수 있습니다.

소켓은 한 프로세스 내에서의 쓰레드 사이에서 WSADuplicateSocket 함수를 사용하지 않고 공유 할 수 있습니다. 왜냐하면, 소켓 기술자 값은 모든 쓰레드 내에서 인식될 수 있는 올바른 값이기 때문입니다.

다른 프로세스간에 공유된 소켓을 만들고, 핸들링 하는 시나리오를 아래에 예로 들어 보았습니다.

Source Process IPC Destination Process
1) WSASocket, WSAConnect 함수 호출    
2) 소켓을 복제할 대상 프로세스의 아이디를 요구함  →  
    3) 프로세스 아이디 요구를 받고,
    이에 응답함.
4) 프로세스 아이디를 얻어냄  
5) WSADuplicateSocket 함수를 호출해서
   
WSAPROTOCOL_INFO 구조체를 얻어냅니다.
   
6) 대상 프로세스로 WSAPROTOCOL_INFO 구조체
    의 내용을 보냅니다.
   
    7) WSAPROTOCOL_INFO 구조체의
    내용을 받습니다.
    8) WSASocket 함수를 호출해서 공유소켓
    기술자를 생성합니다.
10) closesocket   9) 데이터 처리에 공유소켓을 사용합니다.

공유소켓을 가리키는 기술자는 I/O에 대해서 독립적으로 사용될 수 있습니다. 하지만, 윈도즈 소켓 인터페이스는 특정한 타입의 접근에 대해서는 구현되지 않은 점도 있습니다. 공유소켓은 일반적으로 공유소켓을 사용할때, 생성, 접속을 하나의 프로세스에서 담당하고, 데이터의 전송/수신 부분은 다른 프로세스에서 처리하는 형태가 됩니다.


Return Values

에러가 발생하지 않으면, WSADuplicateSocket 함수는 0을 반환 합니다. 에러가 발생한 경우는 SOCKET_ERROR를 반환하고, WSAGetLastError 함수로 특정한 에러코드를 얻어낼 수 있습니다.


Error Codes

WSANOTINITIALISED

이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.

WSAENETDOWN

네트웍 서브 시스템에 에러가 발생했습니다.

WSAEINVAL 지정한 매개변수중 하나가 잘못된 값을 넘겼습니다.
WSAEINPROGRESS 블럭킹 윈속 v1.1 이 WSACancelBlockingCall 함수에서 취소되었습니다
WSAEMFILE 사용가능한 소켓기술자가 더 이상 없습니다.
WSAENOBUFS 사용가능한 버퍼가 없어서, 소켓을 생성 할 수 없습니다.
WSAENOTSOCK 기술자가 소켓이 아닙니다.
WSAEFAULT lpProtocolInfo 매개변수가 제대로 할당된 메모리 어드레스를 가지고 있지 않습니다.

QuickInfo

Windows NT : 사용가능
Windows : 사용가능
Windows CE : 지원되지 않음
Header :
          Win16/32 : winsock.h
          Win32-II : winsock2.h
Import Library :
          Win16 : winsock.lib
          Win32 : wsock32.lib
          Win32-II : ws2_32.lib

See Also

overview, WSASocket

Name
Password
Homepage
Secret