bool NetPipe::Open(size_t buf_size) { assert(!m_reader.IsValid() && !m_writer.IsValid()); if(m_reader.IsValid() || m_writer.IsValid()) return false; InetAddress addr; addr.SetAddr(::htonl(INADDR_LOOPBACK)); addr.SetPort(0); Acceptor acceptor; CHECK_AND_RET( acceptor.Open(addr) ); CHECK_AND_RET( acceptor.GetLocalAddr(addr) ); CHECK_AND_RET( m_writer.Open() ); int opt_val = 0; CHECK_AND_RET( m_writer.SetOpt(IPPROTO_TCP, TCP_NODELAY, &opt_val, sizeof(opt_val)) ); opt_val = buf_size; CHECK_AND_RET( m_writer.SetOpt(SOL_SOCKET, SO_SNDBUF, &opt_val, sizeof(opt_val)) ); CHECK_AND_RET( Connector::Connect(m_writer, addr, 0) ); CHECK_AND_RET( acceptor.Accept(m_reader) ); assert(m_reader.IsValid() && m_writer.IsValid()); m_reader.CloseWriter(); m_writer.CloseReader(); CHECK_AND_RET( m_reader.Enable(NET_NONBLOCK) && m_writer.Enable(NET_NONBLOCK) ); return true; }