WSAStartup(): 윈속 초기화 함수
- WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수.
- WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수.
socket(): 소켓 생성 함수
- 소켓을 생성하고 사용할 프로토콜을 지정한다.
- SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다.
bind(): src ip와 port 설정
- Client는 서버와 달리 일반적으로 bind()를 호출하지 않는다. 그러면 OS가 자동으로 src ip와 port를 지정해준다.
- 다만 Client도 특별한 경우 src ip와 port를 지정하고 싶다면 bind()를 호출하면 된다.
connect(): 서버로의 연결 시도
- 원격 ip와 port(dest ip, dest port)를 이 단계에서 설정한다.
- 이 단계에서 서버와 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' 카테고리의 다른 글
IOCP model(Server) - Idea (0) | 2020.03.14 |
---|---|
Basic model(Chat Client) - Code (0) | 2020.03.01 |
Basic model(Chat Server) - Code (0) | 2020.03.01 |
Basic model(Server) - Idea (0) | 2020.03.01 |
Socket programming Basic model - 개요 (0) | 2020.03.01 |