tcp の iostream化

mytcpbuf の実装

ここでは前節で導入したmytcpbuf classの実装を考察する。

constructor

Tcp stream を iostream 化するので、socket は socket(PF_INET, SOCK_STREAM, 0) で初期化する。一方 buffer size はconstructorの引数で与えられるので、buffer の初期化も、 この引数を使って初期化リストで扱う。すなわち

mytcpbuf::mytcpbuf(size_t rbufsize, size_t sbufsize) :
  m_socket(PF_INET, SOCK_STREAM, 0),
  m_rcvbuf(rbufsize),
  m_sndbuf(sbufsize)
{
  :
};

とするのがよかろう。これですべてのメンバーはmytcpbufのconstructorの 本体に入った時点で構築されており、資源は確保されている。 本体では新たな資源確保は行わず、これら資源を使った操作のみを行う。

この時点で buffer は確保できているので、 buffer pointer を streambuf に伝える操作(setg、setp)を ここで行ってもよいかも知れない。

buffer pointer の設定を constructor で行わない場合は、 Tcp接続が確定する前または直後で行う必要がある。 Tcp stream の場合、接続の確定には3通りある。

  • Client として connect()
  • Server として listen()(ただし address 端点としては bind() で確定)
  • Server socket から accept()

これらすべての場合について buffer pointer の設定を行う 必要があるので、constructor で先に設定しておくことにしよう。

{
  setg(m_rcvbuf.begin(),m_rcvbuf.end(),m_rcvbuf.end());
  setp(m_sndbuf.begin(),m_sndbuf.end());
};

この時、setg() では current position と end position を一致 させておく。これで入力が空であることが streambuf に伝わる。

mysocket を引数とする constructor

一方、mysocket を引数とする constructor は accept() により生成 された socket から object から生成することを想定している。 従って、初期化リストで m_socket はこの引数から copy constructor を 使って生成する。

mytcpbuf::mytcpbuf(const mysocket& sock, size_t rbufsize, size_t sbufsize) :
  m_socket(sock),
  m_rcvbuf(rbufsize),
  m_sndbuf(sbufsize)
{
  :
};

さて、入出力の実体である以下の実装にはいろう。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-06-07 (水) 11:55:59