구축과정이 이렇게 된다고 처음 포스팅때 소개하였습니다. 하나하나씩 짚어보면서 어떠한 역할들을 하며,
메소드의 기본형을 알아보겠습니다.
[서버 구축 순서]
WSAStartup()
▼
socket()
▼
bind()
▼
listen()
▼
accept()
▼
[send, recv]
▼
closesocket()
▼
WSACleanup()
1. 윈속 초기화 WSAStartup()메소드
int WSAStartup( _In_ WORD wVersionRequested, _Out_ LPWSADATA lpWSAData );
참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms742213(v=vs.85).aspx
MSDN설명에 보면 _In_ 과 _Out_ 이 있는데, 여기서 _In_은 Call By Value _Out_ 은 Call By Reference라고 보시면 됩니다.
wVersionRequested
- 프로그램이 요구하는 최상위 윈속 버전을 의미하며, 하위 8비트에 Major버전, 상위 8비트에 Minor버전을 넣어서 전달한다. (현재 윈속 버전 : 2.2)
따라서, 소스코드에서 "MAKEWORD(2,2)"라고 사용했다.
IpWSAData
WSADATA타입 변수의 주소를 전달하며 이를 통해서 시스템에서 제공하는 윈속 구현에 대한 세부 사항을 얻을 수 있다.
사용할 일이 거의 없으므로 현식만 갖추어 쓰면 된다.
2. 소켓 생성 메소드 socket()
SOCKET WSAAPI socket( _In_ int af, _In_ int type, _In_ int protocol );
참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms740506(v=vs.85).aspx
af
주소 체계를 지정한다. (ipV4, ipV6 ...)
type
소켓 타입을 지정한다. (TCP, UDP ...)
SOCK_STREAM -> TCP(연결지향형)
SOCK_DGRAM -> UDP(비연결지향형)
protocol
사용할 프로토콜을 지정한다. (생략가능)
ex) socket(AF_INET, SOCK_STREAM, 0);
-> ipV4, TCP소켓과 TCP프로토콜을 사용.
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ex) socket(AF_INET, SOCK_DGRAM, 0);
-> ipV4, UDP소켓과, UDP프로토콜을 사용.
= socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
3. TCP/IP 프로토콜을 위한 소켓 주소 구조체 bind()
int bind( _In_ SOCKET s, _In_ const struct sockaddr *name, _In_ int namelen );
참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms737550(v=vs.85).aspx
s
클라이언트 접속을 수용할 목적으로 만든 소켓
name
소켓 주소 구조체변수를 지역 IP주소와 지역 포트번호로 초기화 한 후 이 변수의 주소값을 여기에 대입한다.
namelen
소켓 주소 구조체의 길이(바이트단위)를 대입한다.
4. listen()
int listen( _In_ SOCKET s, _In_ int backlog );
참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms739168(v=vs.85).aspx
s
클라이언트 접속을 수용할 목적으로 만든 소켓(리스닝소캣)
backlog
연결 요청 대기 큐의 길이를 나타낸다.
지원 가능한 최대값을 사용하려면 "SOMAXCONN"값을 사용한다.
5. accept()
SOCKET accept( _In_ SOCKET s, _Out_ struct sockaddr *addr, _Inout_ int *addrlen );
참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
s
클라이언트 접속을 수용할 목적으로 만든 소켓
addr
소켓 주소 구조체 변수를 정의한 후, 이 변수의 주소값을 여기에 대입한다.
accept()메소드는 addr이 가리키는 메모리 영역을 클라이언트의 ip주소와 포트번호로 채워 넣는다.
addrlen
정수형 변수를 addr이 가리키는 메모리영역의 크기로 초기화 한 후, 이 벼수의 주소값을 여기에 대입한다.
accept메소드가 리턴하면, 정수형 변수 addrlen은 함수가 초기화한 메모리 크기 값을 가진다.
6.closesocket()
int closesocket( _In_ SOCKET s );
참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms737582(v=vs.85).aspx
s
종료할 소켓 핸들(소켓 생성시 리턴 된 소켓 식별 번호)을 지정한다.
7. WSACleanup()
int WSACleanup(void);
참조 : http://msdn.microsoft.com/en-us/library/windows/desktop/ms741549(v=vs.85).aspx
윈속사용을 중지한다는 점을 운영체제에 알리고, 관련 리소스를 반환하는 역할을 한다.