2010-04-20 3 views
2

저는 Mac OS X 용 두 부분으로 분리 된 응용 프로그램 (데몬과 에이전트)을 작성하고 있습니다. 데몬과 에이전트 사이의 통신을 위해 표준 유닉스 소켓을 사용하고 있습니다. 즉, 소켓은 PF_UNIXSOCK_STREAM으로 생성됩니다.유닉스 도메인 소켓 차단 문제가 있습니다.

에이전트가 생성 될 때 (사용자가 로그인 할 때마다) 먼저 에이전트에 연결하는 것이 소켓에 연결하는 것입니다. 이것은 첫 번째 에이전트에서 완벽하게 작동하는 것 같습니다. 그러나 두 번째 에이전트가 연결될 때 데몬은 다음과 같은 문제가 발생합니다.

읽을 수있는 데이터를 확인하려면 select()을 사용하고 있습니다. select() 호출이 성공하고 읽을 데이터가 있음을 나타냅니다. 내가 전화 할 때 그러나 recv()-1로 반환하고, errno"Resource temporarily unavailable".

이제 35로 설정, 또는, 나는 비 블로킹 소켓이 기대,하지만 난 트리플가-확인이 - I가 소켓을 설정하지 비 차단.

제가 알 수있는 한, 이것은 두 번째 에이전트가 동일한 유닉스 소켓에 연결할 때만 발생합니다. 내가 하나의 데몬과 하나의 에이전트로 제한된다면 모든 것이 완벽하게 작동하는 것처럼 보입니다. 이 이상한 행동을 일으키는 원인은 무엇일까요?

답변

2

잘못된 클라이언트 fd에서 읽으려는 것처럼 들립니다. 코드를 보지 않고도 말하기는 어렵지만 설명에서 약간은 들립니다.

이렇게하면 작동합니다. 서버는 3 개의 파일 디스크립터, 즉 처음으로 청취를 시작한 소켓, 연결된 각 클라이언트에 대한 하나의 파일 디스크립터로 구성됩니다. 원래 소켓에서 읽을 내용이 있으면 새 클라이언트가 있음을 의미합니다. 이 부분이 옳은 것 같습니다. 연결된 각 클라이언트는 독자적인 fd를 제공하여 읽기/쓰기를 수행합니다. 의 어느 쪽이나가 읽을 준비가되어 있으면 select()를 호출하면 반환됩니다. readfds 변수에있는 각 fd를 FD_ISSET()으로 select에서 검사하여 실제로 읽을 데이터가 있는지 확인해야합니다.

이 코드 유형의 기본 예는 here입니다.

관련 문제