2010-06-28 66 views
0

如何區分「偵聽器」文件描述符和「客戶端」文件描述符?epoll:區分「偵聽器」FD

下面是我在manpage例子中看到:

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

「但是,如果我沒有獲得listener什麼?

對不起,如果這是一個模糊的問題。我不太確定如何說出來。

+0

檢查libevent - http://monkey.org/~provos/libevent/ - 確保您不要重新發明輪子。 – Dummy00001 2010-06-28 19:16:17

+0

是的,libevent!狀態機規則! – 2010-06-28 19:22:40

+0

我會檢查出來;謝謝。 – someguy 2010-06-28 19:51:55

回答

3

假設你正在編寫一個服務器,您應該圍繞一些變量保持監聽套接字描述符(listener在手冊頁),或設置一個小型結構每次給epoll_ctl(2)插座並指向它與data.ptr成員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 */ 
} 

正如你可以看到它的更多的工作那麼就能夠訪問服務器的socket描述符,但它保持在一個地方與一個插座的所有信息的一個很好的屬性。

+0

這種方法也可以將一個或多個回調函數與文件描述符相關聯。 – Dummy00001 2010-06-28 19:15:12

+0

是的,這是一種......哦,恐怖......面向對象:) – 2010-06-28 19:18:42

+0

當然,你可以在那裏適合一個'goto',在某個地方! +1,我也使用小型結構(帶* gasp *日誌記錄回調)。 – 2010-06-28 19:21:37