c++ - C/C++ 的非操作系统特定 FD(文件描述符)

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

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

最佳答案

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

https://think-async.com/

关于c++ - C/C++ 的非操作系统特定 FD(文件描述符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30569260/

相关文章:

c# - 何时将某些实体分离到不同的存储库中?

java - DAO 设计模式与 DBUnit 代码

java - 调用 Jersey 服务 (PUT) 时发送电子邮件通知的设计问题

javascript - NodeJS,在 While 循环中向 Promise 添加操作

node.js - 在 Node.js 7.6+ 中是否有任何可能的方法可以使用内置的等待而无需异步?

c++ - distcc 问题 : does it really speeds up compilation?

c++ - 类对象还是指向它们对象的指针?类对象组合与实现

javascript - 如何选择通过 jQuery load() 函数加载的元素?

c++ - 在 key 之外的其他东西上订购容器

C++ 指针不起作用?