2013-01-10 28 views
12

私は、小さなwebsocketサーバ用のwarmcatのlibwebsocket Cライブラリを使用しています。私はサンプルを作成し、作業しており、websocketからデータを受け取ったことに応答してデータを送信することができます(逆のバイトを返送するなど)。しかし、libwebsocketコールバック関数を使用していなくても、サーバーから非同期にデータを送信する方法を理解することはできませんでした。私はlibwbsocket_write()に渡すwsiポインタが必要ですが、コールバック中にポインタを取得する方法を見ていません。libwebsocket経由で非同期データを送信するにはどうすればよいですか?

私はlibwebsocketがスレッドセーフではないことを読んだことがあります。自分の経験で確認したようです。

libwebsockets.c:line2483では、「プロトコルコールバック関数は、非同期送信を許可するために定期的に呼び出されます。これはまさに私が欲しいものですが、私は自分自身のコードでこれが起こっているのを見たことがなく、 "それを有効にする"方法が見つかりませんでした。

WebSocketに非同期で書き込む方法に関する提案私は奉仕していますか? libwebsocketため

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

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

答えて

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例からこれを適応。上記の例は、おおよそそのメッセージが小さな塊でメッセージを送信する方法です。

+0

サーバの代わりにC WebSocketクライアントを書く人にとっては、 'LWS_CALLBACK_SCLOCK_WRITEABLE'の代わりに' LWS_CALLBACK_CLIENT_WRITEABLE'イベントが呼び出されます。 – JasonCG

関連する問題