먼저 socket() 대신 WSASocket()같이 BSD타입의 socket 함수를 사용하기 보다 Winsock API를 사용하는 이유는 윈도우즈에서만 동작 가능한 확장 기능을 사용하기 위해서 사용하는 것입니다.
리눅스와 윈도우 호환되는 범용 BSD 타입의 socket()의 함수 원형은 다음 처럼
SOCKET socket (
int af,
int type,
int protocol
);
밖에 지원 안되지만, Winsock의 WSASocket()의 함수 원형의 경우
SOCKET WSASocket (
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo,
GROUP g,
DWORD dwFlags
);
더 많은 인자를 지원하는 것만 보셔도 윈속 확장 기능을 더 사용하기 위해서 BSD의 socket() 함수는 호환성을 위해서 남겨두고 Winsock API를 따로 만든 이유를 알 수 있습니다.
참고로, Winsock의 socket() 함수는 기본적으로 소켓 속성을 오버랩드 I/O로 주긴 합니다. 그러나 Asynchronous I/O를 구현 하기 위해서 BSD의 select() 뿐 아니라 Winsock에서는 윈도우즈의 메시지 메커니즘이나 Win32 Event 메커니즘을 이용하는 WSAAsyncSelect 또는 WSAEventSelect를 추가로 지원하며 윈도우즈 플랫폼에서 select() 보다 더 효율적인 프로그래밍을 가능하게 합니다.
즉, Winsock API는 BSD 함수보다 윈도우즈의 특성에 맞도록 보다 효율적인 성능을 내도록 하는 함수인 것이죠.
다음 세번째 인자의 protocol의 경우 BSD나 Winsock이나 af가 INET(인터넷)이며, type이 SOCK_STREAM(연결지향)이면
protocol이 0이여도 IPPROTO_TCP로 동작됩니다. 디폴트 프로토콜을 선택한다는 의미이지요.
하지만, 명시해주는 것이 좋을 것 같습니다.
예로, AF_INET에서 RAW 타입으로 ICMP 프로토콜을 사용한다면
socket(AF_INET,SOCK_RAW,IPPROTO_ICMP) 를 해주어야 합니다.
프로토콜 값 및 af, type은 IPX(AF_IPX)나 적외선통신(AF_IRDA), 블루투스(AF_BTH) 등 마다
각각 프로토콜 및 type이 정해져 있습니다.
인터넷에서 찾았습니다...
구글질 했더니 바로 나오네요.. 아래는 인용글입니다.
----------------------------------------------
안녕하세요 TCP/IP 저자 조경민입니다.
먼저 socket() 대신 WSASocket()같이 BSD타입의 socket 함수를 사용하기 보다 Winsock API를 사용하는 이유는 윈도우즈에서만 동작 가능한 확장 기능을 사용하기 위해서 사용하는 것입니다.
리눅스와 윈도우 호환되는 범용 BSD 타입의 socket()의 함수 원형은 다음 처럼
SOCKET socket (
int af,
int type,
int protocol
);
밖에 지원 안되지만, Winsock의 WSASocket()의 함수 원형의 경우
SOCKET WSASocket (
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo,
GROUP g,
DWORD dwFlags
);
더 많은 인자를 지원하는 것만 보셔도 윈속 확장 기능을 더 사용하기 위해서 BSD의 socket() 함수는 호환성을 위해서 남겨두고 Winsock API를 따로 만든 이유를 알 수 있습니다.
참고로, Winsock의 socket() 함수는 기본적으로 소켓 속성을 오버랩드 I/O로 주긴 합니다. 그러나 Asynchronous I/O를 구현 하기 위해서 BSD의 select() 뿐 아니라 Winsock에서는 윈도우즈의 메시지 메커니즘이나 Win32 Event 메커니즘을 이용하는 WSAAsyncSelect 또는 WSAEventSelect를 추가로 지원하며 윈도우즈 플랫폼에서 select() 보다 더 효율적인 프로그래밍을 가능하게 합니다.
즉, Winsock API는 BSD 함수보다 윈도우즈의 특성에 맞도록 보다 효율적인 성능을 내도록 하는 함수인 것이죠.
다음 세번째 인자의 protocol의 경우 BSD나 Winsock이나 af가 INET(인터넷)이며, type이 SOCK_STREAM(연결지향)이면
protocol이 0이여도 IPPROTO_TCP로 동작됩니다. 디폴트 프로토콜을 선택한다는 의미이지요.
하지만, 명시해주는 것이 좋을 것 같습니다.
예로, AF_INET에서 RAW 타입으로 ICMP 프로토콜을 사용한다면
socket(AF_INET,SOCK_RAW,IPPROTO_ICMP) 를 해주어야 합니다.
프로토콜 값 및 af, type은 IPX(AF_IPX)나 적외선통신(AF_IRDA), 블루투스(AF_BTH) 등 마다
각각 프로토콜 및 type이 정해져 있습니다.
댓글 달기