eddy_em: (Default)
eddy_em ([personal profile] eddy_em) wrote2020-05-28 01:17 pm

И еще про вебсокеты

Единственной более-менее приличной библиотекой вебсокетов, что я нашел, оказалась вот эта. Для сравнения с libwebsockets, советую заглянуть, какую там предлагают накатать простыню кода просто для того, чтобы "завести" пример-эхо. Здесь же это — четыре десятка строк! Вот:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <ws.h>

void onopen(int fd)
{
        char *cli;
        cli = ws_getaddress(fd);
        printf("Connection opened, client: %d | addr: %s\n", fd, cli);
        free(cli);
}

void onclose(int fd)
{
        char *cli;
        cli = ws_getaddress(fd);
        printf("Connection closed, client: %d | addr: %s\n", fd, cli);
        free(cli);
}

void onmessage(int fd, const unsigned char *msg)
{
        char *cli;
        cli = ws_getaddress(fd);
        printf("I receive a message: %s, from: %s/%d\n", msg, cli, fd);
        ws_sendframe(fd, (char *)msg, true);
        free(cli);
}

int main()
{
        struct ws_events evs;
        evs.onopen    = &onopen;
        evs.onclose   = &onclose;
        evs.onmessage = &onmessage;
        ws_socket(&evs, 8080);

        return 0;
}

Единственный недостаток — отсутствие поддержки SSL, ну да ладно. Буду делать аутентификацию с использованием CGI, а сессионный ключ по вебсокету надо только один раз — при авторизации — передавать. Авось, студенты не взломают.

Библиотеку опакетил и выложил в своем репозитории: тарбол и ебилд.
С чувством выполненного долга пойду домой: обедать и спать. Надо еще полей ночью нащелкать для экстинкции и калькулятора экспозиции.