공부/Server 6

소켓 옵션 정리

getsockopt & setsockopt 함수 이름에서부터 알 수 있듯이 socket의 옵션정보들을 얻거나 바꿀 수 있는 함수들이다. #include int getsocket(SOCKET sock, int level, int optname, char* optval, int* optlen) // 성공 시 0, 실패 시 SOCKET_ERROR 반환 sock : 옵션 정보를 얻을 소켓 level : 확인할 옵션의 프로토콜 레벨(ex. SOL_SOCKET, IPPROTO_IP, IPPROTO_TCP) optname : 확인할 옵션의 이름(ex. SO_RCVBUF, SO_SNDBUF, SO_TYPE 등) optval : 확인 결과 저장을 위한 버퍼의 주소값 optlen : optval이 가리키고 있는 타입의 크..

공부/Server 2021.08.01

도메인(Domain)과 DNS(Domain Name System)

서버들은 IP로 구분된다. 하지만 IP는 기억하기도 쉽지 않고 표현하기도 힘들다. 그래서 일종의 별명을 IP주소마다 부여했는데 이것을 도메인이라고 한다. 그리고 IP주소와 도메인 사이의 변환을 수행하는 시스템을 가리켜 DNS(Domain Name System)이라고 부른다. 실제로 우리가 특정 웹사이트에 접속할때는 주로 도메인을 이용해서 접속한다. 예를 들어서 검색창에 www.naver.com을 입력했다고 하자. 이때 DNS로 부터 해당 도메인의 IP정보를 얻어오는 과정은 아래와 같다. 1. 로컬 DNS 서버에 입력한 도메인을 IP주소로 변경해줄 것을 요청해서 접근한다. 모든 호스트에는 로컬 DNS 서버가 등록되어 있다. 2. 만약 이 로컬 DNS 서버에 내가 원하는 도메인의 IP주소가 없으면 Root ..

공부/Server 2021.08.01

TCP 기반의 소켓의 우아한 연결 종료(Half-close)

지금까지 TCP 종료 과정은 closesocket()으로 해왔다. 하지만 이 함수 호출은 완전 종료를 의미하며, 완전 종료는 입출력 스트림 모두를 종료한다는 의미이다. 참고로 두 호스트가 연결돼서 상호간의 송수신이 가능한 상태가 된다면 이걸 가리켜 '스트림이 형성된 상태'라고 한다. 이렇게 한쪽 호스트에서 일방적으로 스트림을 끊으면 반대 호스트에서 전송해야할 데이터를 수신 받지 못하게 된다. 연결을 종료했는데 왜 반대쪽에서 보내는 데이터를 또 받으려고 하는가?와 같은 의문이 생길 수도 있다. 예를 들어, 서버와 클라이언트가 스트림이 형성됐다면 서버는 클라이언트에게 파일을 전송하고 서버가 모든 파일의 모든 내용을 전송했다면 끝이라는 의미로 EOF를 전송해야 한다고 해보자. 클라이언트는 서버로부터 EOF를 ..

공부/Server 2021.08.01

TCP/UDP에 대한 이해

인터넷 프로토콜 기반 소켓의 경우 데이터 전송 방법에 따라 TCP(Transmission Control Protocol)/UDP(User Datagram Protocol)로 나뉜다. TCP/UDP는 TCP/IP 프로토콜 스택에 속해 있다. TCP/IP 프로토콜 스택은 4개의 계층으로 나뉘어 있는데 이를 통해 데이터 송수신 과정을 4개의 영역으로 나누어 구현했다는 것을 알 수 있다. 만약 TCP소켓을 생성해서 데이터를 송수신한다면 아래 그림에 있는 4개의 계층을 통해서 이루어 질 것이다. UDP소켓을 생성해서 데이터를 송수신한다면 아래 그림에 있는 계층들을 통할 것이다. 각 계층에 대해 먼저 알아보자. LINK 계층 LINK 계층은 물리적인 영역의 표준화에 대한 결과이다. LAN, WAN과 같은 네트워크 ..

공부/Server 2021.08.01

윈도우 기반 소켓 프로그래밍 필수 함수

// 성공 시 소켓 핸들, 실패시 INVALID_SOCKET 반환 #include SOCKET socket(int af, int type, int protocol) af : 프로토콜 체계 type : 소켓 타입 protocol : 호스트간 통신에 사용되는 프로토콜 // IP주소와 PORT번호 할당 // 성공 시 0, 실패 시 SOCKET_ERROR 반환 #include int bind(SOCKET s, const struct sockaddr* name, int namelen) s : socket함수로부터 할당 받은 소켓 핸들 name : IP주소, PORT번호를 할당한 sockaddr구조체 포인터. 보통 SOCKADDR_IN타입의 구조체에 IP주소와 PORT번호를 할당하고 SOCKADDR*로 형변환해서 ..

공부/Server 2021.07.31

윈도우 기반 소켓 프로그래밍 시작하기(socket, protocol 개념 및 기본적인 함수 정리)

소켓이란? 물리적으로 연결되어 있는 호스트간 데이터 송수신을 가능하게 하는 매개체. Server측에서 필요한 함수들 WSAStartup(프로그램에서 요구하는 소켓 버전을 알리고, 해당 버전의 라이브러리 초기화) -> socket(socket 생성) -> bind(socket 주소 정보 할당) -> listen(socket을 연결 요청 받을 수 있는 상태로 만듬) -> accept(연결, 클라이언트로 부터 연결 요청이 있을 때 까지 대기) -> send(연결 요청이 있는 클라이언트에게 메세지를 보냄) -> closesocket(만약 연결을 종료할 것이라면 서버와 클라이언트 소켓을 닫는다) -> WSACleanup(윈속 라이브러리를 운영체제에 반환함으로써, 윈속 관련 함수 호출 불가) - listen 인자중..

공부/Server 2021.07.27