UDPEchoClient에서 클라이언트가 Sendto() 후 서버의 Sendto()를 기다리는 동안 block되지 않도록 하는 방법

1) non-blocking socket - 서버측

2) asynchronous I/O - 서버측

3) Timeout - 클라이언트측


1)

Process에서 InterruptSignalHandler 실행 중 사용자가 Ctrl+C와 같은 인터럽트 입력 시 System에서 SIGINT가 들어오게되고 InterruptSignalHandler() 내부에서 printf("Interrupt Received"); 와 같은 문자열 출력 후 for(;;)문 내부의 pause가 실행되어 프로그램이 정지된다.


2) 

서버에서 bind() 이후 대기하는 동안 다른 작업(3초마다 . 출력)을 하게 된다. 이 때 클라이언트로부터 요청이 들어와 OS로 부터 SIGIO 신호가 들어오게 되면 서버는 작업을 멈추고 해당 요청에 대한 작업을 수행한다.


3)

UDPClient쪽에 해당함. 클라이언트의 요청에도 서버에서 응답이 없을 경우 타이머를 작동 시켜 다시 데이터를 보내게 되고 계속 응답이 없으면 연결을 끝낸다.

클라이언트는 Sendto() 이후 alarm(TIMEOUT_SECS)로 서버의 응답을 얼마나 기다릴지 설정한다.

이후 설정한 시간동안 응답이 없으면 OS에서 EINT라는 에러메시지를 통해 TIMEOUT를 알리게 된다.

이 과정을 반복하다가 클라이언트에서 설정한 MAXTRIES의 횟수를 넘게 되면 "Sendto() failed" 출력 후 연결을 종료.


※ sigfillset()

int sigfillset(sigset_t *set);

특정 신호가 아닌 모든 신호를 감지하겠다는 의미로 시그널 셋에 모든 시그널을 포함시키는 함수이다.







'Network' 카테고리의 다른 글

멀티태스킹(Multi tasking)  (0) 2013.11.11
신호(Signals)  (0) 2013.11.04
UDPEchoServer  (0) 2013.10.30
소켓옵션들  (0) 2013.10.28
tcp/ip 소켓 프로그래밍 함수 소개  (0) 2013.09.16

+ Recent posts

티스토리 툴바