0

あなたの助けと別のリソースを読んだ後、私は epoll を正常に使用することができました。私が今直面している問題は、EPOLLOUT イベントの戻り値とは異なる FD に送信する必要があることです。したがって、5 つの FD がある場合は、 1 に送信し、次に 4 に送信し、次に 1 に送信し、次に 5 に送信します。

次の疑似コードは、IN イベントと OUT イベントの両方で現在持っているものです。

 while(1) {

 rval = epoll_wait();

    for (i = 0; i < rval; i++) { 
     if (events & EPOLLOUT) {
        //send to the ready FD for sending
      }
     if (events & EPOLLIN) {
        //Receive from ready fd, this part is perfect for my application 
      }
    }
}

私がする必要があるのは、次のようなものです

char buff[100];
fd = read_data(buff); // read data ready to send, the return value is the FD the application should send the returned data to 

send(fd, buff, 100, 0); 

そして、常にすべての fd からデータを受信するので、任意の FD からデータを受信するには EPOLLIN が必要です。その方法がわかりません。助けていただけますか?

4

1 に答える 1

0

送信できるすべての FD の周りにラップページのレイヤーを追加する必要があります。「準備完了」と表示される状態と、ローカル データ キューを持たせます。次に、データを受け入れるインターフェイスを作成します。状態が「準備完了」でない場合は、すぐにデータをエンキューして戻ります。それ以外の場合は (ループで) データを送信しようとし、EAGAIN または EWOULDBLOCK をヒットした場合は、残りをキューに入れ、「準備完了」を false に設定します。

一方、メイン イベント ループでは、EPOLLOUT を取得するたびに、sendループに入ってキューを排出し、エラーが発生せずに終了した場合は、「準備完了」を true に設定します。(このロジックでは、EPOLLOUT は、FD が「準備完了」していない場合にのみ起動する必要があります。これは、エッジ トリガー モードであると仮定した場合です。)

于 2013-02-03T22:26:06.553 に答える