簡體   English   中英

C / C ++的非OS專用FD(文件描述符)

[英]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? 它不做您想做的事嗎?

https://think-async.com/

您無法做到這一點(獲取非OS特定的文件描述符,或者在沒有任何OS支持的情況下可移植地處理網絡套接字)。 文件描述符網絡套接字是特定於操作系統的(或在POSIX標准中)。 C標准庫 (來自C99C11標准)不了解它們。 fileno(3)POSIX 2001 (以及POSIX 2008)。

如果使用C ++進行編碼,則可以使用POCOQt (或Boost )之類的框架庫包裝一些OS服務(例如,用於Linux,MacOSX,Windows,Android)並為您提供一些統一的抽象。 如果使用C語言進行編碼,則可以考慮使用Glib和/或Gio (來自GNOME / GTK)。

順便說一句,您需要某種復用能力(例如Linux和POSIX上提供的poll(2) syscall),並且它是特定於操作系統的。 您也可以考慮使用某些事件循環庫,例如libevlibevent (或使用Qt,POCO,GTK或Glib的事件循環工具)

請注意,C和C ++是不同的語言,並且兩者都可以在沒有任何網絡設施(例如,沒有網絡功能的計算機,嵌入式系統等)的實現中存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM