지금까지 소켓을 생성하고 따로 설정을 하는 과정 없이 바로 사용해왔습니다. 이 경우 기본적으로 설정되어 있는 소켓의 특성으로써 데이터를 송수신하게 됩니다. 그러나 이미 활성화되어 있는 PORT 번호에 할당을 하게 하는(SO_REUSEADDR) 등 소켓의 특성을 변경시켜야 하는 경우도 발생합니다. 소켓의 옵션은 많은 종류가 존재하는데, 프로토콜 레벨로 나눴을 때 SOL_SOCKET, IPPROTO_IP, IPPROTO_TCP가 존재합니다. 각 레벨에는 여러 옵션들이 있는데, 예를 들어 SOL_SOCKET 프로토콜 레벨에는 SO_TYPE 옵션이 있습니다. 먼저 옵션을 참조하고 변경하는 함수를 살펴보겠습니다. #include int getsockopt(int sock, int level, int optname..
소켓 프로그래밍
#include struct hostent* gethostbyname(const char* hostname); // success: hostent 구조체 변수의 주소값 fail: NULL 포인터 위 함수를 이용하면 문자열 형태의 도메인 이름으로 IP 주소 정보를 얻을 수 있습니다. 위 함수의 반환 자료형인 hostent 구조체의 정의는 다음과 같습니다. struct hostent{ char * h_name char ** h_aliases; int h_addrtype; int h_length; char ** h_addr_list; } IP주소 말고도 여러 정보들을 반환해주는 것을 볼 수 있습니다. h_name은 공식 도메인 이름이 문자열로 저장됩니다. 해당 홈페이지를 대표하는 도메인 이름이라는 의미지만 우..
Domain Name System, DNS란 IP주소와 도메인 이름 사이에서의 변환을 수행하는 시스템입니다. DNS의 중심에는 DNS 서버가 존재합니다. 티스토리의 IP주소인 121.53.105.234를 직접 입력하면 티스토리의 페이지를 볼 수 있습니다. 그러나 일반적으로는 티스토리의 도메인 이름인 www.tistory.com을 입력해서 티스토리에 접속하게 됩니다. 둘 모두 똑같이 티스토리에 접속할 수 있습니다. 다만 접속 과정에서는 차이가 있습니다. 도메인 이름은 서버에 부여된 가상의 주소입니다. 만약 도메인 이름으로 접속하게 되면 컴퓨터에 저장되어있는 디폴트 DNS 서버의 주소로 변환을 요청하고 해당 도메인 이름의 IP 주소를 얻어서 서버로 접속하게 됩니다. 일반적으로 IP주소를 외우는 것보다 도메인..
TCP에서는 연결과정보다 중요한 것이 종료과정인데, 종료과정에서는 예상치 못한 일이 발생할 수 있기 때문입니다. close 함수 호출은 송수신을 바로 불가능하게 만드는 완전종료를 의미합니다. 만약 호스트 B가 전송한 데이터가 호스트 A가 꼭 전송받아야 하는데 A가 close를 호출해버리면 호스트 B가 전송한 데이터는 소멸됩니다. 따라서 송신은 가능하지만 발신은 종료하거나 또는 그 반대를 하게 해주는, 데이터의 송수신에 사용되는 스트림의 일부만 종료(half-close)하는 방법이 제공됩니다. 여기서 스트림이란 말이 사용됐는데, 소켓을 통해 두 호스트가 연결되고 데이터의 송수신이 가능한 상태를 스트림이 형성된 상태라고 합니다. 스트림은 단방향성을 가지고 있어, 서로 송수신을 주고받으려면 (양방향 통신을 하..
UDP는 TCP와 달리 흐름제어를 하지 않습니다. 따라서 UDP는 데이터 송수신간 신뢰할 수는 없지만 UDP는 TCP보다 훨씬 빠릅니다. (한번에 송수신하는 데이터의 양이 적을수록 둘의 간격이 커집니다. - 흐름제어 유무차이) 호스트 B가 A에게 데이터를 보낸다고 가정할 때, B가 보낸 UDP 패킷은 먼저 IP를 통해 호스트 A에게 도착하고, 이때부터가 UDP의 역할로 호스트A 내에 존재하는 UDP 소켓중 하나에 최종 전달하게 됩니다. UDP는 물론 데이터의 손실이 적은 편이지만 수 많은 데이터중에서 한개라도 손실되면 안되는 압축파일같은 경우는 반드시 TCP로써 송수신이 이뤄져야 합니다. 다만 실시간 스트리밍과 같은 데이터 손실이 그저 화면이 떨리는 등 큰 영향을 끼치지 않는 경우 TCP보다 빠른 UDP..