PC는 DNS 서버의 IP주소가 설정되어 있어야 한다. 보통 DHCP 프로토콜로 IP 주소를 할당 받으면서 DNS 서버 IP 주소를 DHCP Option 6을 통해 함께 받는다. 이렇게 받은 DNS를 Local DNS라 칭한다. 보통 2개의 IP 주소를 받게 되는데, 하나가 죽었을 때를 대비하기 위해서이다. 위의 주소는 LG U+ DNS 서버 주소이다. 동작 과정 웹 브라우저 주소 창에 www.naver.com 입력. PC는 미리 설정되어 있는 DNS(Local DNS)에게 www.naver.com 이라는 Hostname에 대한 IP 주소를 물어본다. Local DNS에는 www.naver.com에 대한 주소가 있을 수도 없을 수도 있다. 만약 있다면 Local DNS가 바로 PC에 IP 주소를 넘겨주고..
■ EPOLL ? Epoll은 리눅스에서 select의 단점을 보완하여 사용할 수 있도록 만든 I/O통지 모델이다. 파일 디스크립터를 사용자가 아닌 커널이 관리를 하며, 그만큼 CPU는 계속해서 파일 디스크립터의 상태 변화를 감시할 필요가 없다. 즉, select처럼 어느 파일 디스크립터에 이벤트가 발생하였는지 찾기 위해 전체 파일디스크립터에 대해서 순차검색을 위한 FD_ISSET 루프를 돌려야 하지만, Epoll의 경우 이벤트가 발생한 파일 디스크립터들만 구조체 배열을 통해 넘겨주므로 메모리 카피에 대한 비용이 줄어든다. ■ EPOLL 함수#incude int epoll_create(int size) fd들의 입출력 이벤트 저장을 위한 공간을 만들어야 하는데, epoll_create는 size만큼의 입..
select기반 1클라 1스레드(친구 과제용으로 맨듬) 참고 : https://www.joinc.co.kr/w/Site/Network_Programing/Documents/select참고 : http://perfectchoi.blogspot.kr/2009/09/%EC%86%8C%EC%BC%93%EC%9D%98-%EC%9E%85%EC%B6%9C%EB%A0%A5-%EB%AA%A8%EB%8D%B8select-%EB%B0%B0%EC%97%B4-%EC%82%AC%EC%9A%A9.html
소켓의 우아한 연결 종료 Graceful shutdown 1. 사용 이유: 중요 데이터의 소실 방지. 서버로부터 데이터를 전송 받는 도중 클라이언트가 소켓 종료를 시도 하였을 때, 서버와 클라이언트간 I/O 스트림 종료로 인한 데이터 소실을 막기 위해 사용된다. 또한, 서버에서 TIME_WAIT가 남는게 아닌, 클라이언트에서 TIME_WAIT가 남도록 하는것이며, 클라이언트가 먼저 소켓 종료 함수를 호출하도록 하는것이 핵심이다. 즉, TIME_WAIT가 발생하는 것은 정상적인 소켓 종료가 이루어지는 과정에서 자연스럽게 발생하는 과정이다. 추가적으로 TIME_WAIT / CLOSE_WAIT가 남았을 경우 남기지 않고 Linger 옵션을 사용하여 바로 소켓을 종료시키는 비정상종료(Abortive Shutdo..
소켓에서 설정할 수 있는 다양한 옵션들 Protocol Level Option Name get set SOL_SOCKET SO_SNDBUF O O SO_RCVBUF O O SO_REUSEADDR O O SO_KEEPALIVE O O SO_BROADCAST O O SO_DONTROUTE O O SO_OOBINLINE O O SO_ERROR O SO_TYPE O IPPROTO_IP IP_TOS O O IP_TTL O O IP_MULTICAST_TTL O O IP_MULTICAST_LOOP O O IP_MULTICAST_IF O O IPPROTO_TCP TCP_KEEPALIVE O O TCP_NODELAY O O TCP_MAXSEG O O 설정 상태 정보를 가져오는 함수 12345678int getsockop..
사용 이유: IP주소는 상대적으로 변경이 잦다. 서버의 IP주소가 변경되면, 클라이언트 프로그램에 들어가 있는 IP 주소를 변경하고 다시 컴파일 한 다음 재배포를 해야 한다. 반면, 도메인 이름은 일단 등록하고 나면, 유지하는 동안 절대 다른 누군가에게 할당되지 않는다. 즉, IP 주소가 변경 되어도 도메인 이름이 유지되는 동안은 도메인 이름을 DNS 서버를 통해서 IP주소로 변환하여 도메인 이름을 통해 서버에 접속할 수 있도록 해준다. 도메인으로 IP주소 알아내기1struct hostent* FAR gethostbyname(_In_ const char *name);cs: 이 함수의 인자로 변환하고자 하는 도메인 이름을 전달한다.리턴 값은 성공 시 hostent 구조체의 포인터를 리턴하고, 실패 시 NU..
호스트 A가 자신이 전송해야 할 모든 데이터를 전송하고 나서 출력 스트림을 종료한다.그러나 입력 스트림은 종료하지 않았기 때문에 호스트 B로부터 데이터를 수신할 수 있다.자신이 보내고자 하는 데이터를 다 보냈다 하더라도 상대방이 나에게 보낼 데이터가 있을지도 모른다는 생각에 입력 스트림은 종료하지 않고, 출력 스트림만 종료가 가능한다 => 이것을 가능하게 하는 기능이 shutdown() 함수이다. 1int shutdown(_In_ SOCKET s, _In_ int how);css : 종료하고자 하는 소켓의 소켓 핸들how : 종료 모드0 : SD_RECEIVE : 입력 스트림 종료1 : SD_SEND : 출력 스트림 종료2 : SD_BOTH : 입출력 스트림 종료
UDP: UDP는 특별한 경우가 아니면 하나의 소켓을 사용한다. 하나의 소켓을 통하여 여러 호스트들과 데이터를 송/수신할 수 있다. UDP 기반의 데이터 입/출력 함수: UDP 소켓은 연결 상태를 유지하지 않으므로, 데이터를 전송/수신 하는 함수 호출 시 반드시 보내고자/받고자 하는 곳의 주소 정보를 포함해야 한다.123456789int sendto( _In_ SOCKET s, _In_ const char *buf, _In_ int len, _In_ int flags, _In_ const struct sockaddr *to, _In_ int tolen); Colored by Color Scriptercs => 성공 시 전송된 바이트 수 리펀, 실패시 -1 리턴 12345678int recvfrom( _I..