Nicドライバを抽象化

Monaのネットワーク実装に、なぜWinPcapが関係あるのか?と思われた方もいるかもしれません。


がんばってWinPcapの使い方を学んだのには理由があります。
それは、Mona用のプロトコルスタックの開発のほとんどをWindows上で行ってしまおうという意図があるからです。
そこで必要なのがWinPcapなのです。


でもWinPcapは、Monaで使えないよ?という疑問はもっともです。
MonaにはWinPcapはありませんが、代わりにid:Yamamiさんが開発されたドライバがあります。
では、もしもWinPcapMona上のドライバが同じインターフェースで使えたらどうなるでしょうか?
そう、プロトコルスタックNICドライバがWindows上で動いている(WinPcap)か、Mona上で動いているか知らなくて良いことになります。


このように同一のインターフェースを提供することで、Monaコンポーネントの開発をWindows上でほとんど行うことは、これが初めてではなく、実はファイルシステムの実装のときに散々行っています。


というわけで、こんなクラスを作ってみました。
手元ではばっちり動いています。

Nicクラス

public:
virtual int Open() = 0;
virtual int Close() = 0;
virtual int Read(void* buffer, int size) = 0;
virtual int Write(const void* buffer, int size) = 0;
};

WinPcapNicクラス

class WinPcapNic : public Nic
{
public:
WinPcapNic();
virtual ~WinPcapNic();

int Open();
int Close();
int Read(void* buffer, int size);
int Write(const void* buffer, int size);

protected:
pcap_t* handle;
};