2013-07-08 1 views
0

사용자가 동적으로 청취 소켓을 추가 할 수있는 단일 스레드 선택 서버를 작성하고 있습니다. 문제는 청취 소켓을 추가하려는 경우 다른 소켓 중 하나에서 무언가가 발생할 때까지 서버가 새 소켓을 선택하지 않는다는 것입니다.동적 선택 서버

한 가지 해결 방법은 서버에 새 청취 소켓을 목록에 추가하도록 강제로 새 청취 소켓을 추가 할 때마다 신호를 보낼 수있는 가짜 소켓을 목록에 추가하는 것이 었습니다. 이 솔루션은 나에게 조금 "해커"처럼 보입니다. 다른 누군가에게 아이디어가 있는지 알고 싶었습니다.

+0

'accept()'를'select()'와 별도로 실행하고 있습니까? 왜'select()'에서 연결을 받아들이지 않고 동기화 문제가 없습니다. –

+0

select에서 연결을 수락하고 있습니다 ... 그리고 동기화 문제가 없습니다 ... 당신의 코멘트가 무엇인지 잘 모르겠습니다. 제 질문으로합니까? – marler8997

답변

0

네,하지만 다른 청취 소켓을 추가하려면 먼저 서버에 연결 한 다음 다른 소켓을 추가해야한다고 생각합니다.

또한 소켓 호출에 시간 초과 값을 설정할 수도 있습니다. 이 방법은 서버가 요청에 응답하지 않는 경우 시간 초과시 오래된 파일 삭제와 같은 우선 순위가 낮은 작업을 수행 할 수 있습니다.

+0

실제로이 스레드의 소켓을 사용하여 서버에 청취 소켓을 추가하도록 지시하지 않습니다. 당신이 언급 한 시간 초과 정말 내 질문에 상관이 ... 내가 전화를 선택하는 방법을 찾고 있는데 ... 나는이 시간 초과를 사용할 수 있지만 시간이 길어질수록 수신기를 추가하는 데 더 오래 걸린다. , 짧을수록 성능이 향상됩니다. 필자의 경우에는 오랜 시간 동안 아무런 활동도하지 못했을 때 청취 소켓을 추가해야 할 때 바로 받아 들여야합니다. 이 서버가 아무런 이유없이 몇 주 동안 끊임없이 폴링하는 것은 당연한 일입니다. – marler8997

+0

선택/팝하는 세 가지 방법이 있습니다. 신호가 수신되거나, 타이머가 만료되거나, 소켓 디스크립터 중 하나에서 이벤트가 발생합니다. 신호를 사용하려면 HUP를 사용할 수 있습니다. 다른 소켓을 추가하도록 서버에 알려주 는가? (단일 쓰레드 서버 임) –

+0

실제로 멀티 스레드 프로그램입니다. 불필요한 세부 사항을 포함하고 싶지는 않지만 ... 언급 한 내용은 신호가 수신 되었습니까? 비록 내가 가진 신호가 있다면 궁금해? Theres the Accept 신호 ... DataAvailable 신호 ... 신호 쓰기 ....? 오, 당신 HUP 언급? 그게 뭐야? – marler8997

0

가짜 소켓에 대한 귀하의 아이디어는 나쁘지 않습니다. 다른 종류의 명령이나 요청을 서버에 보내기 위해 사용할 수 있기 때문에 소켓을 제어하도록 이름을 바꿉니다. 그리고 시간 초과가 폴링보다 더 많은 시간이 select 일 것입니다.

제어 소켓의 유형도 다른 소켓과 다를 수 있습니다. 예를 들어, TCP 소켓을 사용하는 것보다 로컬 서버 프로그램에 제어 메시지를 보내기 위해 UDP 또는 유닉스 도메인 소켓을 사용하는 것이 더 쉽습니다.

+0

예, 선택 전화를 팝하는 데 사용되는 특수 소켓처럼 보이는 것이 가장 좋습니다 ... 내 생각을 확인하는 데 도움을 주신 것에 감사드립니다 ... – marler8997