2013-01-10 10 views
12

Używam biblioteki libwebsocket C warmcat dla małego serwera sieci Web. Mam przykłady i działa i mogę wysyłać dane w odpowiedzi na odbieranie danych z websocket (takich jak echo powrotem zwróconych bajtów wysłanych). Jednak nie byłem w stanie dowiedzieć się, jak przesłać dane asynchronicznie z serwera, nie będąc już w funkcji wywołania zwrotnego libwebsocket. Potrzebuję wskaźnik wsi przejść do libwebsocket_write(), ale nie widzę, jak uzyskać wskaźnik, z wyjątkiem podczas wywołania zwrotnego.Jak wysłać dane asynchroniczne przez libwebsocket?

Przeczytałem, że libwebocket nie jest bezpieczny dla wątków, jak moje własne doświadczenie zdaje się potwierdzać.

W libwebsockets.c: line2483, czytałem, że "Funkcje wywołania zwrotnego protokołu są [...] okresowo wywoływane, aby umożliwić transmisję asynchroniczną." Dokładnie tego chcę, ale nie zaobserwowałem tego w moim własnym kodzie i nie znalazłem żadnego sposobu, aby go "włączyć".

Sugestie, jak pisać asynchronicznie do websocket, który obsługuję?

Kod libwebsocket: http://git.warmcat.com/cgi-bin/cgit/libwebsockets/

Przykład zastosowania: http://martinsikora.com/libwebsockets-simple-websocket-server

Odpowiedz

8

nie znalazłem super czysty sposób to robić. Sugerowałbym zarejestrowanie wywołania zwrotnego w przypadku, gdy serwer może napisać do klienta, a następnie sprawdzić, czy jest tam praca asynchroniczna. Zdarzenie LWS_CALLBACK_SERVER_WRITEABLE jest właśnie takie, i jeśli zadzwonisz pod numer libwebsocket_callback_on_writable(context, wsi); z poziomu twojego wywołania zwrotnego, będzie on okresowo wywoływany.

Tak, coś takiego:

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; 
} 

I dostosowany to na przykładzie test-fraggle.c; powyższe jest mniej więcej tym, co ten przykład robi, aby wysyłać wiadomości w mniejszych porcjach.

+0

Również dla każdego, kto pisze klienta C WebSocket zamiast serwera, wywoływane jest zdarzenie 'LWS_CALLBACK_CLIENT_WRITEABLE' zamiast' LWS_CALLBACK_SERVER_WRITEABLE'. – JasonCG

Powiązane problemy