2010-06-28 6 views
0

"청취자"파일 디스크립터와 "클라이언트"파일 디스크립터를 어떻게 구별 할 수 있습니까?epoll : "청취자"FD를 구별

는 여기가 manpage 예에서 본 내용은 다음과 같습니다

if(events[n].data.fd == listener) { 
    ... 
} else { 
    ... 
} 

'그러나 나는 listener에 액세스 할 수없는 경우?

죄송합니다. 모호한 질문 인 경우 죄송합니다. 나는 그것을 어떻게 말로 표현할 지 잘 모릅니다. 당신이 서버를 작성하는 가정

+0

libevent - http://monkey.org/~provos/libevent/를 확인하십시오. 휠을 다시 열지 마십시오. – Dummy00001

+0

예, libevent! 상태 머신 규칙! –

+0

나는 그것을 밖으로 검사 할 것이다; 감사. – someguy

답변

3

, 당신은 data.ptr 회원과 각 당신이 epoll_ctl(2)에게 줄 소켓과 포인트에 대한 작은 구조 (매뉴얼 페이지에 listener를) 몇 가지 변수에 주위 청취 소켓 디스크립터를 유지하거나 설치해야 하나 struct epoll_event (소켓이 닫힐 때 해당 구조의 할당을 해제하는 것을 잊지 마십시오). 이 같은

뭔가 :

struct socket_ctl 
{ 
    int fd; /* socket descriptor */ 
    int flags; /* my info about the socket, say (flags&1) != 0 means server */ 
    /* whatever else you want to have here, like pointers to buffers, etc. */ 
}; 
... 
struct socket_ctl* pctl = malloc(sizeof(struct socket_ctl)); 
/* check for NULL */ 
pctl->fd = fd; 
pctl->flags = 1; /* or better some enum or define */ 
struct epoll_event ev; 
ev.events = EPOLLIN|...; 
ev.data.ptr = pctl; 
... 
if ((events[n].data.ptr->flags & 1) != 0) 
{ 
    /* this is server socket */ 
} 

당신이 그럼 그냥 서버 소켓 기술자에 대한 액세스 권한을 가지고 훨씬 더 많은 작업입니다 볼 수 있지만 한 곳에서 하나의 소켓에 관련된 모든 정보를 유지하는 좋은 특성이 있기 때문에 .

+0

이렇게하면 파일 설명자에 콜백 함수를 연결할 수도 있습니다. – Dummy00001

+0

네, 그런 종류의 ... 공포 ... 객체 지향 :) –

+0

분명히 어딘가에 '고토'를 넣을 수 있습니다! +1, 나는 또한 작은 구조를 사용합니다 (* gasp * 콜백 콜백 포함). –