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

时间:2015-06-01 08:50:02

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

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

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

2 个答案:

答案 0 :(得分:1)

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

https://think-async.com/

答案 1 :(得分:0)

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

如果使用C ++进行编码,您可以使用POCOQt(或许Boost)等框架库来包装一些OS服务(例如Linux,MacOSX,Windows,Android)和为您提供一些统一的抽象。如果用C编码,您可以考虑Glib和/或Gio(来自GNOME / GTK)。

顺便说一下,你想要一些多路复用能力(比如Linux&amp; POSIX上提供的poll(2)系统调用),它是特定于操作系统的。您还可以考虑使用某些event loop库,例如libevlibevent(或使用Qt,POCO,GTK或Glib的事件循环设施)

请注意C&amp; C ++是不同的语言,两者都可以在没有任何网络设施的情况下存在(例如没有网络功能的计算机,嵌入式系统等......)。