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通りある。
これらすべての場合について 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) { : }; さて、入出力の実体である以下の実装にはいろう。 |