【问题标题】:Non-OS Specific FD(File Descriptor) for C/C++用于 C/C++ 的非操作系统特定 FD(文件描述符)
【发布时间】:2015-06-01 08:50:01
【问题描述】:

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 ...

我该如何实现它??? :(

【问题讨论】:

    标签: c++ design-patterns asynchronous file-io network-programming


    【解决方案1】:

    为什么不使用 Asio?它不做你想做的事吗?

    https://think-async.com/

    【讨论】:

      【解决方案2】:

      您不能这样做(获取非操作系统特定的文件描述符,或在没有任何操作系统支持的情况下可移植地处理网络套接字)。 File descriptors & network socketsOperating System 特定的东西(或在 POSIX 标准中)。这 C standard library(来自C99C11 标准)不认识它们。 fileno(3)POSIX 2001(在 POSIX 2008 中也是如此)。

      如果使用 C++ 编码,您可能会使用框架库,如 POCOQt(或者可能是 Boost)包装一些操作系统服务(例如,用于 Linux、MacOSX、Windows、Android)并为您提供一些统一的抽象.如果使用 C 编码,您可以考虑 Glib 和/或 Gio(来自 GNOME/GTK)。

      顺便说一句,您需要一些多路复用能力(例如在 Linux 和 POSIX 上提供的 poll(2) 系统调用),并且它是特定于操作系统的。您还可以考虑使用一些 event loop 库,例如libevlibevent(或使用来自 Qt、POCO、GTK 或 Glib 的事件循环工具)

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

      【讨论】:

      • 谢谢,但我想封装或抽象它。如果操作系统不支持它,我想在用户空间中实现它......! :) 为通用抽象创建一个新库...
      • 需要操作系统支持。正如我提到的,只需使用一些事件循环库。或者浪费时间重新实现自己的(这会更麻烦)。最好使用现有的东西。
      猜你喜欢
      • 2017-02-12
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2014-05-08
      • 2011-06-18
      • 2015-01-04
      • 2014-01-02
      • 2020-01-05
      相关资源
      最近更新 更多