WS2_32는 Windows에서 제공하는 라이브러리로 Windows Socket을 사용하기 위한 함수들이 정의되어 있습니다.
아래의 함수 내용은 Windwos MSDN을 바탕으로 작성하였습니다 혹시나 틀린부분이 있으면 알려주시면 감사하겠습니다!! ㅠㅠ
- WS2_32 함수
1. WSCStartup
위 함수는 windows socket사용을 위해 초기화를 진행하는 역할입니다. 윈도우에서 소켓을 사용하기 위해서는 ws2_32.dll의 초기화가 필요하고 해당 초기화를 진행하는 함수가 WSCStartup()입니다.
1) Parameter
Parameter로는 WORD wVersionRequested와 LPWSADATA IpWSAData가 존재합니다.
WSCStart(WORD wVersionRequested,LPWASDATA IpWSAData)
여기서 wVersionRequeted는 사용하는 윈도우 버전중 가장 최신버전을 입력받는 곳으로 WORD 에서 상위는 minor 하위는 major로 입력 받습니다. 해당 매개변수에 값을 입력할 때 MAKEWORD(2,2)를 통해 2개의 인수를 WORD로 pack하여 입력합니다.
두 번째 parameter LPWSADATA IpWSAData는 정보를 저장할 WASDATA 구조체의 주소값을 입력받아 해당 구조체 변수에 윈도우 소켓 정보를 저장하고 초기화 시켜줍니다.
2) Return
정상적으로 함수가 종료되면 0을 리턴하고 그 외에는 error를 의미합니다.
Error의 종류는 다음과 같습니다.
에러코드 |
내용 |
WSASYSNOTREADY |
네트워크 서브 시스템이 네트워크에 접속 준비할 수 없음 |
WASVERNOTSUPPORTED |
요구한 윈도우 소켓의 버전을 지원하지 않음 |
WSAEINPROGRESS |
블로킹 윈도우 소켓이 실행중 |
WSAEPROCLIM |
동시에 실행가능한 윈도우 소켓의 수가 현재 최대치임 |
WAFEAULT |
IpWASDATA의 WASDATA구조체 주소값이 유효하지 않음 |
2. Recv
연결된 소켓으로부터 데이터를 받을 때 사용하는 함수입니다.
1) Parameter
paramter로는 int recv(SOCKET s, char *buf, int len, int flags)가 존재합니다.
-s : 연결하고자 하는 소켓의 descriptor 정보를 입력받습니다.
-buf : data를 소켓으로부터 받아서 저장하는 공간의 주소 값을 입력받습니다.
-len : buf데이터의 길이를 바이트단위로 입력받습니다.
-flags : 기본적으로는 0으로 셋팅합니다. Flags에 따른 다음과 같은 기능이 추가됩니다.
Flags | 내용 |
MSG_PEEK | 들어오는 값을 엿볼 수 있으며 input queue의 데이터가 지워지지 않습니다. 그리고 단일 recv() 호출에 의해 읽어들일 수 있는 데이터를 반환하나 실제 소켓에 대기중인 데이터 양하고의 차이는 있을 수 있습니다! |
MSG_OOB | Out of band Data 프로세스 처리이다. |
MSG_WAITALL | 버퍼가 가득 차거나 connection이 closed되거나, 요청이 취소되거나 에러가 발생한 경우 수신 요청이 완료됩니다. |
2) Return
정상적인 경우 recv()함수를 통해 받은 데이터의 크기만큼을 byte단위로 리턴합니다. 연결이 closed된 경우에는 0을 리턴하고 그 외에 다음과 같은 에러 발생시 SOCKET_ERROR를 return합니다.
Error Code | 내용 |
WSANOTINITIALISED | WSAStartup함수가 아직 성공하지 않음 |
WSAENETDOWN | 네트워크 불안정입니다 |
WSAEFAULT | Buf 파라미터 주소 값이 정확하지 않음 |
WSAENOTCONN | 소켓 연결이 되지 않음 |
WSAEINTR | WSACancelBlockingCall에의해 취소 됨. |
WSAEINPROGRESS | 서비스 제공자가 callback 중이거나 blocking Windows Sockets이 진행중일 때 |
WSAENETRESET | Time to live 에러 혹은 connection이 keep-alivce에의해 끊어졌을 경우 |
WSAENOTSOCK | Socket의 descriptor가 잘못되었을 때 |
WSAEOPNOTSUPP | MSG_OOB flag일 때 해당 domain이나 네트워크에서 Out of band를 지원하지 않는경우 |
WSAESHUTDOWN | 소켓이 shut down 된 경우 |
WSAEWOULDBLOCK | 소켓이 nonblock인데 block을 받을 때 |
WSAEMSGSIZE | 메시지가 너무 많아 buf에 담을 수 없을 때 |
WSAEINVAL | Len이 0이거나 음수일 때, 소켓이 bind되지 않았을 때, 알 수 없는 flags 값이 들어왔을 때 |
WSAECONNABORTED | Virtual circuit이 종료되어 소켓 사용불가 할 때 |
WSAETIMEDOUT | 네트워크 실패나 system failed로 연결이 끊겼을 때 |
WSAECONNRESET | Virtual Ciruit이 리셋 된 경우 |
3. Send
데이터를 보내기 위한 함수이다.
1) Parameter
Int send(SOCEKT s, char *buf, int len, int flags)
-s : 연결한 socket description
-buf : 전송할 데이터가 들어있는 buf주소 값
-len : buf 데이터의 크기 byte단위
-flags : 보통의 경우는 0 값 입력 추가적인 기능 사용시 다음 값 입력
Value | 내용 |
MSG_DONTROUTE | Data가 라우팅 대상이 아니어야 함을 지정 함. |
MSG_OOB | Out of Band Data를 전송함 |
2) Return
정상적인 경우 정상적으로 보낸 데이터의 Byte 단위 크기 만큼을 리턴한다. 그 외에 다음과 같은 에러 발생시 SOCKET_ERROR를 리턴한다.
Error Code | 내용 |
WSANOTINITIALISED | WSAStartup함수가 아직 성공하지 않음 |
WSAENETDOWN | 네트워크 불안정입니다 |
WSAEACCES | Broadcast address가 요청되었는데 적절한 flags가 셋팅되지 않음 |
WSAEFAULT | Buf parameter가 정화기 정해지지 않았을 때 |
WSAENOBUFS | 이용가능한 buf 공간이 없을 때 |
WSAEINTR | WSACancelBlockingCall에의해 취소 됨. |
WSAEINPROGRESS | 서비스 제공자가 callback 중이거나 blocking Windows Sockets이 진행중일 때 |
WSAENETRESET | Time to live 에러 혹은 connection이 keep-alivce에의해 끊어졌을 경우 |
WSAENOTCONN | 소켓이 연결되지 않았을 때 |
WSAENOTSOCK | Socket의 descriptor가 잘못되었을 때 |
WSAEOPNOTSUPP | MSG_OOB flag일 때 해당 domain이나 네트워크에서 Out of band를 지원하지 않는경우 |
WSAESHUTDOWN | 소켓이 shut down 된 경우 |
WSAEWOULDBLOCK | 소켓이 nonblock인데 block을 받을 때 |
WSAEMSGSIZE | 메시지가 너무 많아 buf에 담을 수 없을 때 |
WSAEHOSTUNREACH | 원격 host에 해당 host로부터 연결하지 못할 때 |
WSAEINVAL | Len이 0이거나 음수일 때, 소켓이 bind되지 않았을 때, 알 수 없는 flags 값이 들어왔을 때 |
WSAECONNABORTED | Virtual circuit이 종료되어 소켓 사용불가 할 때 |
WSAETIMEDOUT | 네트워크 실패나 system failed로 연결이 끊겼을 때 |
WSAECONNRESET | Virtual Ciruit이 리셋 된 경우 |
4. WSAFDIsSet
Fd_set 구조체 주소안에 특정 Socket이 속하는지 여부를 체크해 주는 역할을 진행합니다.
1) Parameter
WSAFDIsSet(Socket fd, fd_set *set)
-fd : 확인하고자 하는 Socket
-set : fd_set 구조체의 주소 값
5. Select
소켓의 상태를 설정합니다.
1) Parameter
Int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,const struct timeval *timeout)
-nfds : 버클리 소켓과의 호환성을 위해서만 사용 됨(무시 가능)
-readfds : readability를 검사할 소켓의 주소 값
-writefds : writability를 검사할 소켓의 주소 값
-exceptfds : error 여부를 체크할 소켓의 주소 값
-timeout : wait의 최대 시간을 TIMEVAL 구조로 설정, BLOCK 작업 시에는 null값 입력
2) Return
정상적인 경우 select 된 fd_set 구조체의 전체 개수를 리턴하며 시간 제한일 때는 0 값을 리턴 error의 경우에는 SOCKET_ERROR를 리턴합니다.
Error Code | 내용 |
WSANOTINITIALISED | WSAstartup이 이루어지지 않음 |
WSAEFAULT | Windows socket이 필요한 리소스 할당 불가 혹은 readfds, writefds, excepfds, timeval parameter가 user address space의 일부분이 아닌 경우 |
WSAENETDOWN | 네트워크 불량 |
WSAEINVAL | Time-out 값이 유효하지 않음 혹은 3개의 descriptor parameter가 모두 null값 임 |
WSAEINTR | blocking으로 인한 취소 |
WSAEINPROGRESS | 서비스 제공자가 callback 중이거나 blocking Windows Sockets이 진행중일 때 |
WSAENOTSOCK | Descriptor중 하나가 socket이 아닌경우 |
6. CloseSocket
사용하고 있는 소켓을 close 시키는 함수입니다.
1) Parameter
Int closesocket(SOCKET s)
-s : close하고자하는 소켓의 description
1) Return
정상적으로 close되는 경우 0을 리턴한다. 그 외 에러 발생 시 SOCKET_ERROR 리턴한다.
Error Code | 내용 |
WSANOTINITIALISED | WSAstartup이 이루어지지 않음 |
WSAEFAULT | Windows socket이 필요한 리소스 할당 불가 혹은 readfds, writefds, excepfds, timeval parameter가 user address space의 일부분이 아닌 경우 |
WSAENETDOWN | 네트워크 불량 |
WSAEWOULDBLOCK | 소켓은 non-block인데 linger 구조체 I_onoff가 0이아니고 linger 구조체 I_linger 멤버가 0이아닌 시간 제한 값으로 설정된 경우 |
WSAEINTR | blocking으로 인한 취소 |
WSAEINPROGRESS | 서비스 제공자가 callback 중이거나 blocking Windows Sockets이 진행중일 때 |
WSAENOTSOCK | Descriptor가 socket이 아닌경우 |
7. Connect
소켓과 connection 하는 함수.
1) Parameter
Int connect(SOCKET s, const struct sockaddr *name, int namelen)
-s : unconnected 한 socket description
-name : connection설정에 필요한 sockaddr 구조체의 주소 값(Socket이 붙는 서버구조체)
-namelen : name parameter의 byte단위 크기
2) Return
정상적인 경우 0 리턴, 에러 발생 시 SOCKET_ERROR 리턴
Error Code | 내용 |
WSANOTINITIALISED | WSAStartup함수가 아직 성공하지 않음 |
WSAENETDOWN | 네트워크 불안정입니다 |
WSAEADDRINUSE | Socket address가 이미 존재하는 경우로 이 에러가 발생했을 때 발생하며 bind가 로컬 IP주소의 wild card IP주소일 때 connect 될 때까지 대기합니다. |
WSAEALREADY | Nonblack connect call이 진행중일 때 |
WSAEADDRNOTAVAIL | 원격 주소가 유효하지 않은 경우 |
WSAEAFNOSUPPORT | 구조체의 주소가 이 소켓을 사용할 수 없을 때 |
WSAEINTR | WSACancelBlockingCall에의해 취소 됨. |
WSAEINPROGRESS | 서비스 제공자가 callback 중이거나 blocking Windows Sockets이 진행중일 때 |
WSAECONNREFUSED | 연결 시도가 거절되었을 때 |
WSAEFAULT | Name pointer가 부적절하거나 namelen의 사이즈가 작은 경우 에러 발생 |
WSAEINVAL | Parameter s가 listening socket일 때 |
WSAEISCONN | 소켓이 이미 connect된 경우 |
WSAENETUNREACH | 해당 host에서 네트워크를 할 수 없는 경우 |
WSAEHOSTUNREACH | 소켓은 연결할 수 없는 호스트에 작업을 진행했습니다. |
WSAENOBUFS | 이용 가능한 buffer 공간이 없는 경우 |
WSAENOTSOCK | S paramter가 소켓이 아닌 경우 |
WSAETIMEDOUT | 시간 초과 오류 |
WSAEWOULDBLOCK | Socket은 nonblocking 인데 즉각적으로 연결이 되지 않은 경우 |
WSAEACCES | Socket option이 SO_BROADCAST를 사용할 수 없어 broadcast를 지원하지 않은 경우 |
8. Socket
Service provider와 bind 된 소켓을 생성하는 함수이다.
1) Parameter
Socket(int af, int type, int protocol)
-af : 다음과 같은 옵션을 주로 이용합니다.
Af | 내용 |
AF_UNSPEC(0) | Address family가 명확하지 않음 |
AF_INET(2) | IPv4 Address family |
AF_IPX(6) | IPX/SPX Address family |
AF_APPLETALK(16) | AppleTalk Address family |
AF_NETBIOS(17) | NetBIOS Address family |
AF_INET6(23) | IPv6 Address family |
AF_IRDA(26) | IrDA Address family |
-type : 소켓 타입을 명시하는 것으로 다음 옵션이 존재합니다
Type | 내용 |
SOCK_STREAM(1) | AF_INET, AF_INE6과 TCP를 사용한다 |
SOCK_DGRAM(2) | AF_INET,AF_INET6과 UDP사용 |
SOCK_RAW(3) | IPv4, IPv6 등 다음 상위 계층 프로토콜 헤더를 조작할 수 있도록 원시 소켓을 제공한다. |
SOCK_RDM(4) | 신뢰할 수 있는 메시지 데이터 그램을 제공하며 PGM 멀티 캐스트 프로토콜 구현이 해당 된다. |
SOCK_SEQPACKET(5) | 데이터 그램을 바탕으로 패킷을 제공 함. |
-Protool : 프로토콜을 설정 부분입니다.
Protocol |
내용 |
IPPROTO_ICMP(1) | ICMP 설정으로 AF_UNSPEC, AF_INET, AF_INET6, SOCK_RAW에서 사용 가능 |
IPPROTO_IGMP(2) | IGMP프로토콜AF_UNSPEC,AF_INET,AF_INET6,SOCK_RAW에서 사용 가능 |
BTHPROTORFCOMM(3) | Bluetooth 프로토콜로 AF_BTH,SOCK_STREAM에서 사용 가능 |
IPPROTO_TCP(6) | TCP 프로토콜로 AF_INET, AF_INET6, SOCK_STREAM에서 사용 가능 |
IPPROTO_UDP(17) | UDP 프로토콜 AF_INET, AF_INET6, SOCK_DGRAM 사용 가능 |
IPPROTO_ICMPV6(58) | ICMPv6 프로토콜 AF_UNSPEC, AF_INET, AF_INET6, SOCK_RAW 사용 가능 |
IPPROTO_RM(113) | PGM 프로토콜 AF_INET, SOCK_RDM 에서 사용 가능 =IPPROTO_PGM |
2) Retrun
정상적인 경우 생성된 new socket의 description을 리턴 합니다. 에러 발생 시 INVALID_SOCKET을 리턴합니다.
Error Code | 내용 |
WSANOTINITIALISED | WSAStartup이 실행되지 않음 |
WSAENETDOWN | 네트워크 불량 |
WSAEAFNOSUPPORT | Family address 문제 예를들어 AF_IRDA 인데 해당 PC에 사용하기 위한 설치가 되지않은 경우 |
WSAEINPROGRESS | 차단 호출이 진행중이거나 서비스 공급자가 콜백 함수 처리 중 |
WSAEMFILE | 소켓 descriptor가 이용가능 하지 않은 경우 |
WSAEINVAL | 유효하지 않은 인수 제공 AF 매개변수와 PARAMETER, PROTOCOL 간에 서로 맞지 않은 값이 존재하는 경우 |
WSAEINVALIDPROVIDER | 서비스 제공자가 2.2이외의 버전 반환 |
WSAEINVALIDPROCTABLE | 서비스 제공자가 유효하지 않거나 정확하지 않은 WSPStartup table을 제공 함. |
WSAENOBUFS | 소켓생성에 사용 될 이용가능한 버퍼 없음 |
WSAEPROTONOSUPPORT | 프로토콜을 지원하지 않음 |
WSAEPROTOTYPE | 해당 소켓에 적합하지 않은 프로토콜 |
WSAEPROVIDERFAILEDINIT | Namespace provider나 layered service provider가 정상적으로 설치되지않아 provider가 정상적으로 작동하지 않는 경우 |
WSAESOCKTNOSUPPORT | Address family에서 지원하지 않는 소켓 타입인 경우 |
9. Inet_addr
String을 IN_ADDR에 적절한 IPv4로 바꿔주는 함수이다.
1) Parameter
Inet_addr(const char *cp)
-cp : IPv4형태로 바꿔주기 위한 문자열 입력
2) Return
정상적인 경우 IPv4 값을 리턴합니다. Ip address의 문법에 어긋나는 값이 들어있는 경우(255보다 큰 숫자) INADDR_NONE 에러가 발생합니다. Windows server 2003 이후 버전에서는 빈 값인 경우 INADDR_NONE 에러가 발생하고 windows xp의 경우 빈 값이 들어오면 INADDR_ANY 에러가 발생 합니다.
10. Htons
U_short 호스트 데이터를 TCP/IP 데이터로 변환해주는 함수 입니다.
1) Parameter
Htons(u_short hostshort)
-hostshort : 16bit host byte 값입니다.
2) Return
TCP/IP 값의 network byte를 리턴합니다.
후... 블로깅 하는게 아직 많이 익숙치가 않지만 생각보다 재밌네요 ㅎㅎ
이상으로 WS2_32 라이브러이에 대한 간단한 포스팅을 마무리 하겠습니다...~!!
오타나 틀린 부분 발견되면 댓글주시면 감사하겠습니다!!
'OS > Windows' 카테고리의 다른 글
[Windows] Windows PE (0) | 2021.10.31 |
---|---|
[Windows] ADS (2) | 2018.07.01 |
[Windows] 윈도우 문자열 처리 (0) | 2018.03.19 |
[Widnows] darknet windows 설치 (9) | 2018.01.21 |