Не зависящий от ОС FD(дескриптор файла) для 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 ...
Как я могу это реализовать???!:(
2 ответа
Вы не можете сделать это (получить дескриптор файла, не относящийся к ОС, или переносить сетевые сокеты без какой-либо поддержки ОС). Файловые дескрипторы и сетевые сокеты являются специфическими для операционной системы (или в стандарте POSIX). Стандартная библиотека C (из стандартов C99 или C11) не знает их. fileno (3) - это POSIX 2001 (а также в POSIX 2008).
Если вы пишете код на C++, вы можете использовать библиотеки фреймворков, такие как POCO или Qt (или, возможно, Boost), оборачивая некоторые службы ОС (например, для Linux, MacOSX, Windows, Android) и предоставляя вам несколько унифицированных абстракций. Если кодирование на C, вы можете рассмотреть Glib и / или Gio (из GNOME/GTK).
Кстати, вам нужна некоторая возможность мультиплексирования (например, syscall poll(2) для Linux и POSIX), и она зависит от операционной системы. Вы также можете рассмотреть возможность использования некоторой библиотеки цикла событий, например, libev или libevent (или использовать средства цикла событий из Qt, из POCO, из GTK или Glib)
Обратите внимание, что C & C++ - это разные языки, и оба могут существовать в реализациях без каких-либо сетевых средств (например, компьютеры без сетевых возможностей, встроенные системы и т. Д.).
Почему бы не использовать Asio? Разве это не делает то, что вы хотите сделать?