2012-04-03 2 views
0

들어오는 연결을 수신 할 때 연결을 허용하고 소켓 설명자를 목록에 추가하는 TCP 서버 응용 프로그램이 있습니다. 서버는 목록을 반복하여 모든 연결된 클라이언트에게 주기적으로 보낼 수 있도록 목록을 필요로합니다.poll()에서 소켓 설명자를 추가/제거합니다.

클라이언트 중 하나가 연결을 닫으면 해당 소켓 설명자를 목록에서 삭제해야합니다.

poll()에 대한 설명자를 추가하여 POLLHUP 일 수있는 닫힌 연결을 감지 할 수 있었지만 모든 들어오는 새 연결에서 설명자를 동적으로 추가하기 위해 폴링을 중단하는 방법을 알아낼 수 없습니다.

서버는 데이터를 보낼 때마다 열려있는 모든 연결에 대한 설명자 목록 만 있으면됩니다.

어떻게해야합니까? 어떤 제안?

편집 : 다음은 내가 한 일입니다. 각 클라이언트에 대한 스레드를 생성하고 폴링 할 fd를 추가했습니다. 서버에서 의사 코드 :

sockfd = accept the conn. 
pthread_create 

// Inside the thread, add sockfd to poll 
struct pollfd fds[1]; 
fds[0].fd = sockfd; 
poll(fds, 1, 500000); 
Check for POLLHUP returned event and see which client(fd) closed the connection. 

이 모든 설명을 폴링 것 같다,하지만 내 문제는 지금은 두 사람과 함께 연결을 닫는 시험했을 때 clients..only 기술자 중 하나가 POLLHUP를 반환한다는 것입니다.

+0

여러 클라이언트에서 테스트 한 결과 서버에 연결된 첫 번째 클라이언트를 제외한 모든 소켓을 닫음으로써 POLLHUP이 트리거됨을 알았습니다. – ddd

답변

3

동적으로 들어오는 모든 새 연결

당신은 활동에 대한 청취 소켓을 모니터링해야에 그 세트에 설명을 추가 설문 조사를 중단하는 방법을 알아낼 수 없습니다. poll의 차단을 해제하면 가장 먼저 확인한 것은 "내 청취 소켓이 재미 있습니까?"입니다. 그렇다면 poll과 자신의 목록을 수락하고 추가하십시오.

관련 문제