23

libev で引数が渡される状況に陥っています。

通常、libev は*receive_callback*のような関数でパッケージを受け取りますが、実際には、受け取ったパッケージに応じて特定のジョブを処理するために、相対*write_callback*をディスパッチする必要があります。例えば:

S_RECV_MSG* pstRecvMsg = (S_RECV_MSG*) recv_buff;
switch(pstRecvMsg->wMsgType) {
    case 1: 
        ev_io_init(w, write_callback1, w->fd, EV_WRITE);
        break;
    case 2:
        ev_io_init(w, write_callback2, w->fd, EV_WRITE);
        break;
    case 3:
        // .......
}

私の質問は、write_callbackXrecv_buff 内の特定のコンテンツも読み取る必要がある場合、recv_buff 引数を callbackX に渡すにはどうすればよいですか? ここで、グローバル変数の負担と醜さを負担する必要がありますか?

4

2 に答える 2

5

著者は自分で答えましたが、コメントで。これは未回答として表示されるため、「回答」セクションに回答を投稿し、ループを閉じています。より良い方法があるかどうかはわかりません...お気軽に修正してください。

質問の著者は次のように述べています。

申し訳ありませんが、私は今答えを得たと思います。ドキュメントを読む不注意を深く恥じています:

struct my_io{
   ev_io io;
   int otherfd;
   void *somedata;
   struct whatever *mostinteresting;
};
// ...
struct my_io w;
ev_io_init (&w.io, my_cb, fd, EV_READ);

そして、次のように my_io を使用します。

static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)
{
   struct my_io *w = (struct my_io *)w_;
   //...
}
于 2013-07-11T16:14:03.400 に答える
2

はい、libev ドキュメントで説明されていますが、別の方法があります。各ウォッチャーには、読み取りまたは変更できる void *data メンバーがあり、libev はそれを完全に無視するため、次のように引数を渡すことができます。

w->data = (void *)recv_buff;
...
static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)
{
    S_RECV_MSG *recv_buff = (S_RECV_MSG*)w_->data;
    ...
}

libev ドキュメントを参照してください。

于 2015-01-17T10:51:35.393 に答える