현생/TCP 소켓 프로그래밍

프로토콜 레벨 SOL_SOCKET에 있는 SO_TYPE 옵션은 소켓의 타입정보를 확인하는 옵션입니다. #include #include #include #include void error_handling(char *message); int main(int argc, char *argv){ int tcp_sock, udp_sock; int sock_type; socklen_t optlen; int state; optlen=sizeof(sock_type); // tcp/udp 소켓 생성 tcp_sock=socket(PF_INET, SOCK_STREAM, 0); udp_sock=socket(PF_INET, SOCK_DGRAM, 0); //tcp/udp 소켓 생성 시 2번째 인자로 들어간 상수 값 출력 print..
지금까지 소켓을 생성하고 따로 설정을 하는 과정 없이 바로 사용해왔습니다. 이 경우 기본적으로 설정되어 있는 소켓의 특성으로써 데이터를 송수신하게 됩니다. 그러나 이미 활성화되어 있는 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소켓에서는 데이터를 전송할 목적지의 IP와 PORT번호를 등록하지 않습니다. 그렇기 때문에 sendto 함수호출을 통한 데이터의 전송 과정은 크게 세 단계로 이루어져 있습니다. 1. UDP 소켓에 목적지의 IP와 PORT번호 등록 2. 데이터 전송 3. UDP 소켓에 등록된 목적지 정보 삭제 sendto 함수가 호출될 때마다 위의 과정을 반복하게 되는데, 이렇게 목적지 정보가 등록되어 있지 않은 소켓을 가리켜 "unconnected 소켓"이라고 합니다. 반면 목적지가 정해져 있는 UDP소켓을 "connected 소켓"이라고 합니다. 이 소켓은 하나의 호스트에게 오랜 시간 데이터를 송수신 해야할 때 (하나의 호스트에게 sendto 함수를 많이 호출해야 할 때) 사용합니다. 위 과정의 1,3을 줄이게 ..
UDP는 TCP와 달리 데이터의 경계가 존재하는 프로토콜입니다. 따라서 데이터의 송수신 과정에서 호출하는 입출력 함수의 호출 횟수가 큰 의미를 갖습니다. 그렇기 때문에 데이터를 전부 수신하기 위해선 입력함수의 호출횟수와 출력함수의 호출횟수는 완벽하게 일치해야합니다. 만약 데이터를 수신하는 호스트A와 데이터를 송신하는 호스트B가 다음과 같이 송수신을 한다고 합시다. //호스트 A// for(int i=0; i
UDP에서는 TCP와 달리 연결 설정 과정이 필요 없으므로 listen 함수와 accept 함수는 사용하지 않고 UDP 소켓의 생성과 데이터의 송수신 과정만 존재합니다. 또, UDP는 하나의 소켓으로 둘 이상의 호스트를 대상으로 데이터의 송수신이 가능하므로 소켓은 하나만 있으면 됩니다. 다만 TCP는 상대와 연결되기에 주소 정보를 따로 추가하지 않아도 되지만 UDP 소켓은 연결상태를 유지하지 않으므로 데이터를 전송할 때마다 목적지의 주소정보를 별도로 추가해야 합니다. #include ssize_t sendto(int sock, void *buff, size_t nbytes, int flags, struct sockaddr *to, socklen_t addrlen); //success: 전송된 바이트 수 ..
푸더기
'현생/TCP 소켓 프로그래밍' 카테고리의 글 목록 (4 Page)