[英]Spoofing file descriptor in C++
我正在編寫一個庫,它將通過多條路由傳輸數據; TCP,UDP,RDMA(遠程直接內存訪問),有時還通過直接的函數調用將客戶端/服務器轉換為單個二進制文件。
我將使用文件描述符處理TCP,UDP,RDMA,並一直在研究如何使用粗略形式的FunctionCallSocket類實現某種類似的功能:
class FunctionCallSocket
{
public:
FunctionCallSocket();
~FunctionCallSocket();
void send(char* buf, std::size_t len);
void recv(char* dest, std::size_t len);
private:
char* m_outboundBuffer;
char* m_inboundBuffer;
};
我想做的是能夠像對待文件描述符一樣對待類,從而可以將其與TCP,UDP等文件句柄一起傳遞給select / epoll。
據我了解,文件描述符整數值是由操作系統從一個私有表生成的,該表將文件映射到id,因此我需要以某種方式進行欺騙。
關於如何實現此目標有任何想法嗎?
如果您在Linux上運行,建議您使用eventfd-這正是您想要的。
http://www.kernel.org/doc/man-pages/online/pages/man2/eventfd.2.html
在EFD_SEMAPHORE模式下打開fd,您可以使用它來跟蹤您有多少個排隊事件
(每個write()調用都會使內核存儲的帶有事件fd的計數器遞增,而每個read()都會使計數器遞減)
如果需要,可以使用特定於操作系統的調用來獲取文件描述符。 例如,Unix open函數可以完成您想要的操作。
或者,可以使代碼讀取和寫入多態類層次結構的數據,這將使您可以在適當的地方使用文件描述符,並使用流庫(例如)進行文件I / O。 實際上,一種想法可能是編寫自定義流類來包裝TCP連接,然后使用ostream和istream作為圍繞連接細節的包裝。
如果它不是文件描述符,則沒有必要將其傳遞給select()。 如果下面有文件描述符,那么您要么需要一個API來公開它,要么您需要一個低級API來將文件描述符添加到選擇集中並使該類負責注冊它使用的任何文件描述符。 請注意,您現在已經非常了解異步事件處理和回調領域。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.