OS 的非 OS 特定 FD(文件描述符)用于 C/C++

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 支持的情况下可移植地处理网络套接字)。 File descriptors & network sockets are an Operating System 特定的东西(或在 POSIX 标准中)。这 C standard library (from C99 or C11 standards) does not know them. fileno(3) is POSIX 2001(以及 POSIX 2008)。

如果使用 C++ 编码,您可能会使用框架库,例如 POCO or Qt (or perhaps Boost) wrapping some OS services (e.g. for Linux, MacOSX, Windows, Android) and providing you with some unified abstractions. If coding in C, you could consider Glib and/or Gio(来自 GNOME/GTK)。

顺便说一句,你需要一些多路复用能力(比如 poll(2) syscall provides on Linux & POSIX), and it is operating system specific. You could also consider using some event loop library, like e.g. libev or libevent(或者使用 Qt、POCO、GTK 或 Glib 的事件循环工具)

请注意,C 和 C++ 是不同的语言,两者都可以存在于没有任何网络设施的实现中(例如,没有网络能力的计算机、嵌入式系统等...)。