チャンネル、パッケージには、ファイルディスクリプタfdのにすることができます。
構造体チャンネル:プライベートコピー不可{ チャンネル(EventBase * ベース、int型のfd、int型のイベント)。 〜チャンネル(); EventBase * getBase(){ 戻りbase_。} int型の FD(){ 戻りFD_。} // 通道のID int64_d IDは、(){ 戻りID_。} 短いイベント(){ 戻りevents_と、} // 关闭通道 ボイド近いです(); 無効 onRead(CONSTタスク&readcb){readcb_ = readcb。} のボイドonWrite(CONSTタスク&writecb){writecb_ = writecb。} ボイド onRead(タスク&& readcb){readcb_ = STD ::移動(readcb)。} ボイド onWrite(タスク&& writecb){writecb_ = STD ::移動(writecb)。} // 启动读写监听 空隙 enableRead(BOOL イネーブル) 空 enableWrite(BOOL 有効)。 空 enableReadWrite(ブール読める、ブール書き込み可能)。 BOOL )(readEnabled。 BOOL )(writeEnabled。 // 处理读写事件 ボイドhandleRead(){readcb_()。} ボイドhandleWrite(){writecb_()。} 保護: EventBase * base_。 PollerBase * poller_。 int型FD_; 短いevents_; int64_tのID_; std ::機能 < 無効()> readcb_、writecb_、errorcb_。 }。
その実装は以下のとおりです。
チャンネル::チャネル(EventBase * ベース、int型のfd、int型のイベント):base_(ベース)、FD_(FD)、events_(イベント){ fatalif(ネット:: setNonBlock(FD_) < 0、" チャンネル設定以外のブロックに失敗しました" ); 静的原子<int64_tの> ID(0 )。 ID_ = ++ ID; poller_ = ベース - > IMP _-> poller_。 poller_ - > addChannel(この); } チャネル::〜Channle(){ クローズ(); } のボイドChannle :: enableRead(BOOL イネーブル){ 場合(イネーブル){ events_ | = kReadEvent。 } 他{ events_&=〜KReadEvent。 } poller_ - > updateChannel(本) } ボイドチャネル:: enableWrite(BOOL イネーブル){ 場合(イネーブル){ events_ | = kWriteEvent。 } 他{ events_&=〜kWriteEvent。 } poller_ - > updateChannel(本) } 空チャンネル:: enableReadWrite(ブール読める、ブール書き込み可能){ 場合(読み){ events_ | = kReadEvent。 } 他{ events_&=〜kReadEvent。 } 場合(書き込み可能){ events_ | = kWriteEvent。 } 他{ events_&=〜kWriteEvent。 } poller_ - > updateChannel(本) } ボイドチャネル::近い(){ 場合(FD_が> = 0 ){ トレース(" 近いチャネル%LD FD%D "、(長い)ID_、FD_)。 poller_ - > removeChannel(この); ::近い(FD_)。 FD_ = - 1 。 handleRead(); } } BOOL チャネル:: readEnabled(){ 戻り events_&kReadEvent。 } BOOL チャネル:: writeEnabled(){ 戻り events_&kWriteEvent。 }