WSAStartup(): 윈속 초기화 함수
- WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수.
- WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수.
socket(): 소켓 생성 함수
- 소켓을 생성하고 사용할 프로토콜을 지정한다.
- SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다.
bind(): 소켓의 local IP주소와 local port를 지정한다.
- int bind(SOCKET s, const struct sockaddr *name, int namelen); 함수 사용.
- 두번째 인자는 SOCKADDR_IN 구조체에 값을 담아 SOCKADDR*형으로 캐스팅하여 전달한다.
listen(): 소켓의 상태를 listening으로 바꾼다.
- SOMAXCONN: 지원할 수 있는 최대 연결값.
accept(): 접속한 client와 통신할 수 있는 새로운 소켓을 생성해서 리턴
- 서버에 접속한 클라이언트와 통신할 수 있는 새로운 소켓(ClientSocket)을 생성해준다. 이 때 remote IP와 remote Port가 결정된다.(즉 SOCKADDR_IN구조체를 까보면 누가 접속했는지 알 수 있는 것이다.)
- client의 ip: inet_ntoa(clientAddr.sin_addr)
- client의 port: ntohs(clientAddr.sin_port)
- 이 지점이 Client와 Server간 TCP 3way handshake가 발생하는 지점이다.
recv()
- recv()함수는 OS의 recv buffer의 데이터를 응용프로그램의 buffer에 복사한 다음 해당 데이터를 OS의 버퍼에서 삭제한다.
- recv()함수는 OS의 recv buffer에 데이터가 도달하면 가능한 많은 데이터를 응용프로그램으로 올려 buffer에 복사한 후 실제 복사한 바이트 수를 리턴한다.
- 주의할점은 len값이 충분히 크지 않으면 한번에 수신버퍼에 담긴 내용을 다 응용프로그램으로 끌어올 수 없다는 것이다. 따라서 얼만큼의 데이터를 받아야 할지 미리 알고 있다면 그만큼에 도달할때까지 recv()를 여러 번 호출해야 한다.
- 그리고 또 한가지 recv() 가 리턴하는 경우가 있는데 상대편 응용프로그램이 closesocket()함수를 호출해 접속을 종료하는 경우다. 이 경우 TCP handshake(FIN, ACK, FIN, ACK)가 발생해 접속을 종료하게 되며 recv()는 0을 리턴한다.
send()
- send()함수는 데이터를 실제로 NIC를 통해 쏘는 함수가 아니라 응용프로그램의 데이터를 OS의 소켓 데이터 구조체의 송신버퍼에 복사하는 함수이다. 일정 시간이 지나야만 OS에 의해 데이터 전송이 완료된다.
- Blocking 소켓의 경우: 소켓 데이터 구조체의 송신버퍼 여유 공간이 len보다 작으면 응용프로그램은 대기상태가 된다. 충분한 공간이 생기면 응용프로그램(프로세스)가 깨어나서 송신버퍼로 len만큼 데이터 복사가 일어나고 send()함수가 len을 리턴한다
- nonblocking소켓의 경우: 소켓 데이터 구조체의 송신버퍼의 여유공간만큼 데이터를 복사한 후 실제 복사한 바이트 수를 바로 리턴한다.
closesocket()
- socket은 handle값이므로 반드시 프로그램 종료 시 closesocket()으로 닫아줘야한다.
WSACleanup()
'Programming > Windows Socket Programming' 카테고리의 다른 글
Basic model(Chat Client) - Code (0) | 2020.03.01 |
---|---|
Basic model(Client) - Idea (0) | 2020.03.01 |
Basic model(Chat Server) - Code (0) | 2020.03.01 |
Socket programming Basic model - 개요 (0) | 2020.03.01 |
TCP/IP 개요 (0) | 2020.03.01 |