wsServer - uma pequena biblioteca de servidor WebSocket escrita em C
wsServer é uma biblioteca de servidor WebSocket pequena e leve escrita em C que pretende ser fácil de usar, rápida, hackeável e compatível com o RFC 6455.
As principais características são:
Enviar/receber mensagens de texto e binárias
Quadros PING/PONG
Apertos de mão de abertura/fechamento
Baseado em evento (onmessage, onopen, onclose)
Portabilidade: Funciona bem em Windows, Linux (Android incluído), macOS e FreeBSD
Consulte o relatório da Autobahn e os documentos para uma análise 'aprofundada'.
wsServer requer apenas um compilador compatível com C99 (como GCC, Clang, TCC e outros) e nenhuma biblioteca externa.
A maneira preferida de construir wsServer em ambientes Linux:
clone do git https://github.com/Theldus/wsServercd wsServer/ make# Opcionalmente, um usuário também pode instalar wsServer no sistema,# em caminhos padrão ou fornecendo PREFIX ou DESTDIR env# vars para o Makefile.make install # Ou make install DESTDIR=/my/folder/
CMake permite ao usuário construir facilmente o wsServer em outros ambientes além do Linux e também permite o uso de um IDE para construir o projeto automaticamente. Se esse for o seu caso:
clone do git https://github.com/Theldus/wsServercd wsServer/ mkdir compilação && cd compilação/ cm fazer.. fazer ./examples/echo/echo # Aguardando conexões de entrada...
O Windows tem suporte nativo via MinGW, as etapas de configuração e construção do conjunto de ferramentas são detalhadas aqui.
wsServer simplifica o gerenciamento de soquetes, permitindo que você se concentre em apenas três tipos diferentes de eventos:
/* Novo cliente. */void onopen(cliente ws_cli_conn_t);/* Cliente desconectado. */void onclose(ws_cli_conn_t client);/* Cliente enviou uma mensagem de texto. */void onmessage(cliente ws_cli_conn_t, const unsigned char *msg, tamanho uint64_t, tipo int);
Esta é a única coisa com que você precisa se preocupar. Você não precisa pensar em valores de retorno no soquete, aceitar conexões ou qualquer outra coisa. Como bônus, cada cliente é tratado em um thread separado, então também não há necessidade de se preocupar com isso.
Mais exemplos, incluindo seus respectivos arquivos html, podem ser encontrados na pasta exemplos/, ;-).
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <ws.h>/** * @brief Esta função é chamada sempre que uma nova conexão é aberta. * @param cliente Conexão do cliente. */void onopen(cliente ws_cli_conn_t) {char *cli;cli = ws_getaddress(client);printf("Conexão aberta, endereço: %sn", cli); }/** * @brief Esta função é chamada sempre que uma conexão é fechada. * @param cliente Conexão do cliente. */void onclose(cliente ws_cli_conn_t) {char *cli;cli = ws_getaddress(client);printf("Conexão fechada, endereço: %sn", cli); }/** * @brief Eventos de mensagens vão aqui. * @param cliente Conexão do cliente. * @param msg Conteúdo da mensagem. * @param size Tamanho da mensagem. * @param type Tipo de mensagem. */void onmessage(cliente ws_cli_conn_t,const unsigned char *msg, tamanho uint64_t, tipo int) {char *cli;cli = ws_getaddress(client);printf("Recebi uma mensagem: %s (%zu), de: %sn", msg,size, cli);sleep(2);ws_sendframe_txt(client, " olá");sleep(2);ws_sendframe_txt(cliente, "mundo"); }int principal(void) {/* * Loop principal, esta função nunca* retorna. * * *Se .thread_loop for != 0, um novo thread será criado * para lidar com novas conexões e ws_socket() se tornará * sem bloqueio. */ws_socket(&(struct ws_server){/* * Vincular host, como: * localhost -> localhost/127.0.0.1 * 0.0.0.0 -> global IPv4 * :: -> global IPv4+IPv6 (Dual stack) * /.host = "localhost", .porta = 8080, .thread_loop = 0, .timeout_ms = 1000, .evs.onopen = &onopen, .evs.onclose = &onclose, .evs.onmessage = &onmessage});return (0); }
o exemplo acima pode ser construído com: make examples
.
Dentro de extra/toyws
há um projeto complementar chamado ToyWS. ToyWS é um cliente WebSocket muito simples e burro feito exclusivamente para funcionar com wsServer. Extremamente limitado, seu uso é altamente desencorajado com outros servidores que não o wsServer e deve ser usado apenas em conjunto com o wsServer.
Este miniprojeto serve apenas como auxílio ao wsServer e libera o usuário de usar projetos adicionais para usar o wsServer em sua totalidade.
Mais informações em: extra/toyws/README.md
wsServer atualmente não suporta criptografia. No entanto, é possível utilizá-lo em conjunto com o Stunnel, um proxy que adiciona suporte TLS a projetos existentes. Basta seguir estas quatro etapas fáceis para obter suporte TLS no wsServer.
wsServer está sempre aberto à comunidade e disposto a aceitar contribuições, seja com problemas, documentação, testes, novos recursos, correções de bugs, erros de digitação... bem vindo a bordo. Certifique-se de ler as diretrizes de estilo de codificação antes de enviar um PR.
O projeto foi útil para você? Tem algo a dizer sobre isso? Deixe seus comentários aqui.
wsServer é licenciado sob licença GPLv3. Escrito por Davidson Francis e outros colaboradores.