ip

제가 지금까지 작성해온 글들을 한 페이지에 정리해둔 것입니다. 개념을 정리한게 아닌 함수가 무엇이 있었는지 쉽게 찾기위한 정리입니다. 함수의 이름만 써져있으며, ()은 인자가 없다는게 아닌 함수라는 것을 뜻합니다. 전체 내용은 LINUX를 기반합니다. 프로토콜 체계와 소켓의 타입 소켓의 프로토콜 체계와 타입을 설정해서 TCP소켓 또는 UDP소켓으로 만들 수 있었다. 2. 소켓의 프로토콜과 타입 [TCP/IP][C][LINUX] 프로토콜이란 컴퓨터 상호간 대화에 필요한 통신규약입니다. #include int socket(int domain, int type, int protocol); // success: 파일 디스크럽터 fail: -1 sys/socket.h에서 소켓 함수는 위와 같이 구성되.. pupu..
https://pupuduck.tistory.com/63에서는 멀티프로세스 기반의 서버구현에 대해 다뤘는데, 프로세스의 생성은 select나 epoll에 비해 확실히 구분되는 장점이 있지만 큰 단점들이 있었습니다. 프로세스 생성 자체가 부담스럽다. 두 프로세스 사이에서 데이터 교환을 위해선 별도의 IPC 기법을 거쳐야 한다 컨텍스트 스위칭이 초당 수십번에서 수천번까지 일어난다. 여기서 컨텍스트 스위칭이란 A프로세스와 B프로세스가 있고 메인 메모리에 A프로세스가 있을 때, B프로세스를 실행하기 위해 A프로세스 관련 데이터를 메인 메모리에서 하드디스크로 이동시키고 B프로세스를 메인 메모리에 이동시키는 것입니다. 이 과정이 초당 수십번에서 수천번 일어나는 것은 큰 부담이 아닐 수 없습니다. 이 여러 단점을 최..
레벨 트리거 방식은 입력버퍼에 데이터가 남아있는 동안 계속 이벤트가 등록됩니다. 엣지 트리거 방식은 입력버퍼로 데이터가 수신된 상황에서 딱 한 번만 이벤트가 등록됩니다. https://pupuduck.tistory.com/88에 따르면 epoll_event 구조체의 event 변수에 EPOLLET를 지정함으로써 엣지트리거로 변경시킬 수 있습니다. ex) event.events=EPOLLIN|EPOLLET; 엣지 트리거 기반의 서버 구현을 위해선 변수 errno를 이용한 오류 원인 파악과 Non-blocking IO를 위해 소켓의 특성을 변경하는 방법을 알아야합니다. 일반적으로 소켓관련 함수는 오류가 발생했을 때 -1을 반환하는데, 이로써 오류의 원인을 알 수는 없습니다. 헤더파일 errno.h를 incl..
https://pupuduck.tistory.com/78에서 select 함수를 통한 IO 멀티플렉싱을 다뤘습니다. select 함수는 대부분의 운영체제에서 작동한다는 큰 강점이 있습니다. 다만 select 함수는 두 가지 큰 문제점이 있는데, 첫 번째로 모든 파일 디스크립터를 대상으로 반복문을 돌려야 한다는 것이고, select 함수를 호출할 때마다 인자로 관찰대상에 대한 정보들을 매번 전달해야 합니다. 프로그램으로서, 운영체제에게 데이터를 매번 전달하는 것은 많은 부담이 따릅니다. 따라서 운영체제에게 관찰대상에 대한 정보를 한 번만 알려주고 관찰대상의 범위나 내용에 변경이 있을 때 변경 사항만 알려줄 필요가 있습니다. 이는 운영체제가 지원을 해줘야 작동이 가능한데, 이 지원하는 방식을 리눅스에서는 e..
https://pupuduck.tistory.com/85에서 다뤘듯 fdopen 함수로 파일 디스크립터를 FILE형 포인터로 변환시킬 수 있습니다. 그리고 https://pupuduck.tistory.com/70에서 입출력 스트림 분리와 분리했을 때의 장점을 다뤘습니다. 위 글에서는 스트림 분리목적으로 입출력 루틴 독립을 통한 편의성을 느리고, 입력에 상관없이 출력이 가능하게 함으로 속도의 향상을 기대할 수 있었는데, 이 글에서는 읽기모드와 쓰기모드를 구분해야 하는 FILE 포인터를 사용하므로 두 모드의 구분을 통한 편의성 증대와 버퍼링 기능의 향상을 기대할 수 있습니다. 분리된 파일 포인터와 파일 디스크립터, 소켓의 관계는 위와 같이 표현됩니다. 그런데 만약, Half-close를 위해서, 예를 들어 ..
표준 입출력 함수의 장점은 이식성이 좋고, 버퍼링을 통해 성능을 향상시킬 수 있습니다. 소켓을 생성할 때 운영체제는 입출력을 위한 버퍼를 생성하는데, 표준 입출력 함수를 사용하면 추가 버퍼를 제공받습니다. 만약 문자열을 전송한다고 할 때, 먼저 표준 입출력 함수의 버퍼에 저장된 후 소켓의 출력버퍼로 이동한 후 전송됩니다. 버퍼링을 통해 전송하는 데이터를 묶어서 출력 버퍼로 보냄으로 출력버퍼로 데이터 이동 횟수가 줄어들어서 성능을 향상시키게 됩니다. 1바이트를 10회 이동시키는 시간이 10바이트를 1회 이동시키는 시간보다 10배 가까운 시간이 소모된다고 합니다. 표준 입출력 함수의 단점은 양방향 통신이 쉽지 않고, 상황에 따라 fflush함수(파일 스트림 버퍼를 비우는 함수)를 자주 사용하게 되며, 파일 ..
멀티캐스트 멀티캐스트 서버가 멀티캐스트 그룹에게 데이터를 전송하면 그룹의 클라이언트는 모두 데이터를 수신합니다. 멀티캐스트 그룹의 수는 IP 주소 범위 내에서 무제한으로 추가할 수 있습니다. (데이터를 수신하려면 멀티캐스트의 그룹에 가입하면 됩니다.) 멀티캐스트는 UDP를 기반으로 하지만 UDP패킷과 다르게 하나의 패킷만 네트워크에 띄워놓으면 라우터들이 패킷을 복사해서 호스트들에게 전달합니다. 멀티캐스트 패킷의 전송을 위해선 TTL 설정이 필요한데, Time To Live의 약자로 정수로 표현되며 라우터를 하나 거칠 때마다 1씩 감소합니다. 만약 0이된다면 패킷은 더 이상 전달되지 않습니다. int send_sock; int time_live=64; ... send_sock=socket(PF_INET,S..
write & read 지금까지 써온 입출력 함수입니다. 리눅스에선 소켓을 파일처럼 다룰 수 있다는 점을 이용해 파일 입출력 함수를 사용해왔습니다. #include //입력 함수 - success: 전달한 바이트 수, fail: -1 ssize_t write(int fd, const void *buf, size_t nbytes); //출력 함수 - success: 수신한 바이트 수(EOF 전송 시 0), fail: -1 ssize_t read(int fd, void *buf, sized_t nbytes); send & recv #include //입력 함수 - success: 전송된 바이트 수, fail: -1 ssize_t send(int sockfd, const void *buf, size_t nby..
푸더기
'ip' 태그의 글 목록