[英]Non-OS Specific FD(File Descriptor) for C/C++
Linux也被視為文件,網絡套接字。 但是,Windows不是。 以及普通文件和網絡套接字被視為“ FD”。 如果代碼不應該依賴操作系統,應該怎么寫?
我認為如下
#ifndef INVALID_SOCKET
#define INVALID_SOCKET (-1)
#endif
class Descriptor {
private:
int m_fd;
public:
Descriptor() : m_fd(INVALID_SOCKET) { }
virtual ~Descriptor() { this->close(); }
virtual bool isValid();
virtual bool close() = 0;
virtual int getNo() { return m_fd; }
};
enum EListenFlags {
E_LISTEN_READ = 1,
E_LISTEN_WRITE = 2,
E_LISTEN_ERROR = 4,
E_LISTEN_NONBLOCK = 8
};
class AsyncDescriptor : public Descriptor {
// like EPoll (for linux) or IOCP (for Windows) or SELECT, POLL...
public:
virtual bool listen(Descriptor* pDesc, int listenFlags) = 0;
virtual bool dizzy(Descriptor* pDesc, int dizzyFlags) = 0;
virtual bool wait(std::list<Descriptor*>& listOut) = 0;
virtual bool list(std::list<Descriptor*>& listOut) = 0;
virtual bool getFlags(Descriptor* pDesc, int* flagOutput) = 0;
};
class SocketDescriptor : public Descriptor {
// Omitted.......
};
// Details are omitted below ...
我該如何實施呢? :(
為什么不使用Asio? 它不做您想做的事嗎?
您無法做到這一點(獲取非OS特定的文件描述符,或者在沒有任何OS支持的情況下可移植地處理網絡套接字)。 文件描述符和網絡套接字是特定於操作系統的(或在POSIX標准中)。 C標准庫 (來自C99或C11標准)不了解它們。 fileno(3)是POSIX 2001 (以及POSIX 2008)。
如果使用C ++進行編碼,則可以使用POCO或Qt (或Boost )之類的框架庫包裝一些OS服務(例如,用於Linux,MacOSX,Windows,Android)並為您提供一些統一的抽象。 如果使用C語言進行編碼,則可以考慮使用Glib和/或Gio (來自GNOME / GTK)。
順便說一句,您需要某種復用能力(例如Linux和POSIX上提供的poll(2) syscall),並且它是特定於操作系統的。 您也可以考慮使用某些事件循環庫,例如libev或libevent (或使用Qt,POCO,GTK或Glib的事件循環工具)
請注意,C和C ++是不同的語言,並且兩者都可以在沒有任何網絡設施(例如,沒有網絡功能的計算機,嵌入式系統等)的實現中存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.