如何區分「偵聽器」文件描述符和「客戶端」文件描述符?epoll:區分「偵聽器」FD
下面是我在manpage例子中看到:
if(events[n].data.fd == listener) {
...
} else {
...
}
「但是,如果我沒有獲得listener
什麼?
對不起,如果這是一個模糊的問題。我不太確定如何說出來。
如何區分「偵聽器」文件描述符和「客戶端」文件描述符?epoll:區分「偵聽器」FD
下面是我在manpage例子中看到:
if(events[n].data.fd == listener) {
...
} else {
...
}
「但是,如果我沒有獲得listener
什麼?
對不起,如果這是一個模糊的問題。我不太確定如何說出來。
假設你正在編寫一個服務器,您應該圍繞一些變量保持監聽套接字描述符(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描述符,但它保持在一個地方與一個插座的所有信息的一個很好的屬性。
這種方法也可以將一個或多個回調函數與文件描述符相關聯。 – Dummy00001 2010-06-28 19:15:12
是的,這是一種......哦,恐怖......面向對象:) – 2010-06-28 19:18:42
當然,你可以在那裏適合一個'goto',在某個地方! +1,我也使用小型結構(帶* gasp *日誌記錄回調)。 – 2010-06-28 19:21:37
檢查libevent - http://monkey.org/~provos/libevent/ - 確保您不要重新發明輪子。 – Dummy00001 2010-06-28 19:16:17
是的,libevent!狀態機規則! – 2010-06-28 19:22:40
我會檢查出來;謝謝。 – someguy 2010-06-28 19:51:55