들어오는 연결을 수신 할 때 연결을 허용하고 소켓 설명자를 목록에 추가하는 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를 반환한다는 것입니다.
여러 클라이언트에서 테스트 한 결과 서버에 연결된 첫 번째 클라이언트를 제외한 모든 소켓을 닫음으로써 POLLHUP이 트리거됨을 알았습니다. – ddd