2013-03-06 5 views
0

TCP 소켓을 통해 하나씩 플로트 배열을 보내고 있습니다. 내 서버 (수신자 - 여러 요청을 동시에 처리하는 프로그램)는 값 0을받을 때까지 데이터를 읽어야합니다. 클라이언트 (보낸 사람)가 연결 한 후 (또는 마지막으로 보낸 값 이후) 10 초 동안 아무 것도 보내지 않으면 나는 서버에 연결하십시오. 이 신호 접근법을 발견했지만 스레드에서 사용하는 것이 최적이 아닌 것 같지만 fork()가 전역 변수를 사용해야하기 때문에 가능성이 큽니다. 함수에 "소켓"매개 변수를 보내야합니다. 그래서 그것을 닫을 수 있고 AFAIK는 이것이 가능하지 않습니다.멀티 스레딩을위한 C 신호 (대체?)

void time_out(int semnal) { 
    printf("Time out.\n"); 
    close(socket); 
    exit(1); 
} 

와 클라이언트가 연결, 또는 뭔가를 전송 될 때마다, 나는이 전화 :

signal(SIGALRM, time_out); 
alarm(10); 

다른 어떤 옵션 10 초를 계산하고이 타이머를 다시 시작 할 수 있도록해야합니까?

+1

어떤 종류의 I/O 멀티플렉싱 (예 :'epoll')을 사용하고 있다면, 이미 리눅스에서 'timerfd'와 같이 사용할 수있는 네이티브 타이밍 메커니즘이있을 가능성이 높습니다. 시간 초과 등) –

+0

timerfd가 작동하는 방법에 대한 링크 나 작은 예제를 좀 더 구체적으로 작성해 주실 수 있습니까? (예를 들어 Linux 매뉴얼 페이지를 찾았지만 그 예제는 아주 간단하지 않습니다) – NiCU

+1

'timerfd' 매뉴얼 꽤 분명하다. 시간 간격이 다되었을 때 읽을 준비가 된 파일 설명자를 작성합니다. 해당 파일 설명자를 모니터 된 세트에 넣으면 타이머가 시작된시기를 알 수있는 편리한 f}이 있습니다. –

답변

2

빈 FD 세트와 시간 초과로 select를 사용할 수 있습니다. 아주 흔하고 휴대하기가 쉽습니다.

+0

감사합니다. 더 나은 솔루션을 찾으려고했지만 가장 적합한 솔루션이었습니다. – NiCU