본문 바로가기

Network/중급 TCP/IP socket

06. 멀티플렉싱(multiplexing)과 select()함수 멀티플렉싱(multiplexing)>>> 통신분야에서는 (다중화기) : 지금까지 작성했던 프로그램들은 모두 하나의 단일 채널에서 일어는 입/출력만을 다루었습니다 즉 이전의 모든 버전의 에코 서버는 한번에 하나의 클라이언트 연결만을 처리 하였습니다 하지만 응용프로그램은 여러 채널의 입/출력을 동시에 처리하는 능력을 요구할 때가 자주 있습니다. 예를 들어 동시에 여러 포트를 열어서 에코서버를 할때 서버가 각 소켓을 생성하고 이를 각 포트에 바인딩 한 후 무슨 일이 일어날까를 생각해 봅시다. 기존방식에는 문제점이 발견되는데 서버는 연결을 accept할 준비가 되어있습니다 하지만 어떤 소켓을 선택해야 할지 선택을 하지 못합니다. 아무 서버나 연결하게 된다면 기존의 대기하고 있는 소켓역시 대기가 되어버리는 불편한.. 더보기
05. pipe() 파이프 멀티 프로세스 이용시 문제점 : 프로세스는 메모리가 독립적으로 존재하기 때문에 메모리를 프로세스간 프로세스간 데이터를 주고 받는 것은 불가능합니다. 쉽게 설명하자면 fork()이용 하여 server 혹은 client 쪽에서 생성된 부모 자식 프로세스 들은 프로그램내 프로세스끼리는 데이터를 주고 받을 방법이 없습니다. 해결책 : 서로 독립된 프로세스들이 데이터를 주고 받기 위해 운영체제는 '파이프'라는 함수를 제공하고 있습니다 pipe() 파이프 생성 함수 -하나의 파이프 및 파이프에 대한 두 개의 파일 디스크립터가 생성 -하나의 파이프를 프로세스들이 공유 #include int pipe(int fd[2]); 성공시 0, 실패시 -1 리턴 -fd : 크기가 2인 int형 배열을 요구 -fd[0] : 함수 .. 더보기
04. 부모 자식 프로세서를 이용한 통신 fork()를 이용하여 프로세서를 복사하여 추가로 프로세서를 만들수있다는것을 확인하였습니다 기존의 프로세서를 부모프로세서라고 하면 추가로 생긴 프로세서를 자식 프로세서라고 합니다 초급에서 다루었던 UDP TCP 통신 프로그램의 경우에는 단방향으로 쓰거나 읽는것이 가능했습니다 하지만 fork()를 사용하여 부모 자식 프로세서를 활용하면 좀더 개선된 양방향 통신이 가능합니다 그림참고>> 위 그림에서 처럼 server client 에서 각각 부모 자식을 생성하여 부모에서 자식으로 읽고 쓰는 형태를 만들어 보겠습니다 talk_client.c #include #include #include #include #include #include #include #include #include #include #defin.. 더보기
03. fork() / 좀비프로세스 / wait waitpid / sigchld fork()함수 프로그램내 동작하고 있는 프로세스를 복사하고 복사한 프로세스를 독립적으로 돌려주는 함수입니다 흔히 원복 프로세서를 부모프로세스라 부르고 복사한 프로세스를 자식프로세스라 부릅니다. 헤더 unistd.h 형태 pid_t fork(void); 반환 pid_t 실행에 실패하면 -1 을 반환. 부모에게는 새로 생성된 자식 프로세스 PID가 반환되며, 자식 프로세스에는 0이 반환됩니다. #include #include #include int global_var = 0; int main() { pid_t ret_pid, child; int local_var = 0; ret_pid = fork(); if(ret_pid > 좀비 프로세스 - 프로세스 종료 후 메모리상에서 사라지지 않은 프로세스 좀비 프로.. 더보기
02. 시그널 처리(SIGNAL) 시그널(signal) : 어떤 이벤트(인터럽트, 타이머종료)가 발생 했을 때 운영체제가 프로그램에 이를 알리는 기법을 뜻합니다 현재 실행되고 있는 프로그램에 시그널이 전달되었을시 4가지 상황이 발생합니다 1. (운영체제의 의해) 시그널이 무시된다. 프로세서는 시그널이 도착한 것을 알지 못한다 2. 운영체제는 프로그램을 강제로 종료한다 3. 프로그램 실행이 인터럽트 되면 이후에 프로그램이 지정한 시그널 처리 루틴이 실행 4. 시그널이 블로킹된다 프로그램이 시그널을 허용 할 때 까지 아무런영향을 미치지 못한다 해당프로세서에서는 어떠시그널이 블록되었는지 마스크를 가지고 있다 종류 이벤트 기본동작 SIGALARM 알람 타이머의 만료 프로그램 종료 SIGCHLD 자식 프로세서가 종료됨 시그널 무시 SIGINT 인.. 더보기
01. 소켓옵션(sockopt) / getsockot setsockopt 소켓옵션 소켓동작 자체에 관련된 여러가지 옵션의 값을 조정할수 있고 바꿀수 있습니다 소켓옵션을 이용하여 특히 소켓 설정 정보를 읽어오는 getsockopt를 이용하여 TCP / UDP타입을 확인하여 봅시다 #include #include #include #include #include #include void error_handling(char * message); int main() { int tcp_sock, udp_sock; int sock_type = -1; socklen_t optlen; int state; optlen = sizeof(sock_type); tcp_sock = socket(PF_INET, SOCK_STREAM, 0); udp_sock = socket(PF_INET, SOCK_DG.. 더보기