2014-12-19 40 views
0

我正在使用epoll系統調用來處理TCP對話中的多個客戶端。在epoll數據結構中同時使用void * ptr和int fd

我已經註冊epoll與FD:

epoll_ctl (efd, EPOLL_CTL_ADD, fd, &event); 

,並能夠與比較FD的使用:

if(conn->getSockfd() == events[i].data.fd) 
    // .... 

但隨着epoll的數據結構

typedef union epoll_data { 
    void *ptr; 
    int  fd; 
    uint32_t u32; 
    uint64_t u64; 
} epoll_data_t; 

我要地圖一個對象(函數)到特定的fd字段,所以我可以在調用這個函數後比較。

但我沒有得到正確的結果。有可能做或不做?如果是,那麼我可以使用它?

+0

你現在怎麼樣? –

+0

目前我可以比較特定客戶端的'fd'。我想用特定的'fd'來映射一個對象。所以假設我有5個連接,每個連接都會有不同的對象。所以我可以爲每個「fd」調用正確的對象。 – anurudh

回答

0

您正在爲您的epoll_data_t使用聯合。所以它一次只能存儲一個字段。所以無論你的void *,int,不管。

我注意到你用C++所以這裏是我會處理這個問題標記你的問題:

你可以在一個類/結構配合一個描述符和函數在一起,然後創建一個新的實例您接受每個連接/創建。在施工過程中,您可以將FD和函數傳遞給您的新對象。

下面是它的快速和未經考驗的概念:

template < typename FunctionType > 
struct Connection 
{ 
    int FD; 
    std::function<FunctionType> DoStuff; 

    Connection(int descriptor, const std::function<FunctionType>& Func) 
     : FD  (descriptor) 
     , DoStuff (Func) 
} 

然後,您可以調用構造函數,通過它您的文件描述符,並用一個std ::綁定來執行,然後通過做連接調用它的函數。做東西()。

如果你使用佔位符等,你可以使用參數等。有關std::bindstd::function的更多信息,請參閱超鏈接。

相關問題