13

小さな websocket サーバーに warmcat の libwebsocket C ライブラリを使用しています。私は例を稼働させており、websocket からのデータの受信に応答してデータを送信できます (送信された逆のバイトをエコーバックするなど)。ただし、libwebsocket コールバック関数にまだ入っていない状態で、サーバーからデータを非同期に送信する方法を理解できませんでした。libwebsocket_write() に渡す wsi ポインターが必要ですが、コールバック以外でポインターを取得する方法がわかりません。

私自身の経験が確認しているように、libwebsocket はスレッドセーフではないことを読みました。

libwebsockets.c:line2483 で、「プロトコル コールバック関数は [...] 非同期送信を許可するために定期的に呼び出される」と読みました。これはまさに私が望んでいることですが、自分のコードでこれが起こっていることを確認しておらず、「オンにする」方法が見つかりませんでした。

私が提供している websocket に非同期的に書き込む方法についての提案はありますか?

libwebsocket のコード: http://git.warmcat.com/cgi-bin/cgit/libwebsockets/

使用例: http://martinsikora.com/libwebsockets-simple-websocket-server

4

1 に答える 1

8

私はそれを行うための非常にきれいな方法を見つけていません。私が提案するのは、サーバーがクライアントに書き込むことができるイベントにコールバックを登録し、そこに送信する非同期作業があるかどうかを確認することです。LWS_CALLBACK_SERVER_WRITEABLEイベントはそれだけであり、libwebsocket_callback_on_writable(context, wsi);コールバック内から呼び出すと、定期的に呼び出されます。

したがって、次のようなものです。

static int callback_myprotocol(struct libwebsocket_context *context,
                               struct libwebsocket *wsi,
                               enum libwebsocket_callback_reasons reason,
                               void *user, void *in, size_t len)
{
    SendState *ss = (SendState*)user;

    switch (reason) {
    case LWS_CALLBACK_ESTABLISHED: 
        printf("connection established\n");
        // get the ball rolling
        libwebsocket_callback_on_writable(context, wsi);
        break;

    case LWS_CALLBACK_SERVER_WRITEABLE: {
        if (!work_to_be_done) {
            // schedule ourselves to run next tick anyway
            libwebsocket_callback_on_writable(context, wsi);
            return 0;
        }
        // send our asynchronous message
        libwebsocket_write(wsi, buf, size, flag);
        // and schedule ourselves again
        libwebsocket_callback_on_writable(context, wsi);
        break;
    }
    default:
        break;
    }

    return 0;
}

test-fraggle.cこれを例から適応させました。上記は、その例がメッセージを小さなチャンクで送信するために行うことの大まかなことです。

于 2013-03-05T21:46:02.667 に答える