Ответ 1
Я не нашел супер чистого способа сделать это. Я бы предложил зарегистрировать обратный вызов события, которое сервер может записать клиенту, а затем проверить, есть ли там асинхронная работа для отправки. событие 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
; выше пример примерно того, что этот пример делает для отправки сообщений в более мелких фрагментах.