wsServer - C로 작성된 매우 작은 WebSocket 서버 라이브러리
wsServer는 사용하기 쉽고 빠르며 해킹이 가능하고 RFC 6455를 준수하도록 C로 작성된 작고 가벼운 WebSocket 서버 라이브러리입니다.
주요 기능은 다음과 같습니다.
텍스트 및 바이너리 메시지 보내기/받기
핑/퐁 프레임
악수 열기/닫기
이벤트 기반(onmessage, onopen, onclose)
이식성: Windows, Linux(Android 포함), macOS 및 FreeBSD에서 잘 작동합니다.
'심층' 분석은 아우토반 보고서 및 문서를 참조하세요.
wsServer에는 C99 호환 컴파일러(예: GCC, Clang, TCC 등)만 필요하며 외부 라이브러리는 필요하지 않습니다.
Linux 환경에서 wsServer를 구축하는 데 선호되는 방법:
자식 클론 https://github.com/Theldus/wsServercd wsServer/ make# 선택적으로 사용자는 기본 경로에 또는 PREFIX 또는 DESTDIR env# 변수를 Makefile.make install #에 제공하여 시스템에 wsServer를 설치할 수도 있습니다. # 또는 make install DESTDIR=/my/folder/
CMake를 사용하면 사용자는 Linux 이외의 다른 환경에서도 wsServer를 쉽게 빌드할 수 있으며 IDE를 사용하여 프로젝트를 자동으로 빌드할 수도 있습니다. 귀하의 경우:
자식 클론 https://github.com/Theldus/wsServercd wsServer/ mkdir 빌드 && cd 빌드/ 씨메이크 .. 만들다 ./examples/echo/echo # 들어오는 연결을 기다리는 중...
Windows는 MinGW를 통해 기본적으로 지원되며, 도구 체인 설정 및 빌드 단계는 여기에 자세히 설명되어 있습니다.
wsServer는 세 가지 종류의 이벤트에만 집중할 수 있도록 하여 소켓 관리를 단순화합니다.
/* 새 클라이언트. */void onopen(ws_cli_conn_t client);/* 클라이언트 연결이 끊어졌습니다. */void onclose(ws_cli_conn_t client);/* 클라이언트가 문자 메시지를 보냈습니다. */void onmessage(ws_cli_conn_t 클라이언트, const unsigned char *msg,uint64_t 크기, int 유형);
이것이 당신이 걱정해야 할 유일한 것입니다. 소켓의 반환 값, 연결 수락 또는 기타 사항에 대해 생각할 필요가 없습니다. 보너스로 각 클라이언트는 별도의 스레드에서 처리되므로 이에 대해 걱정할 필요가 없습니다.
해당 HTML 파일을 포함한 더 많은 예제는 예제/폴더(;-)에서 찾을 수 있습니다.
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <ws.h>/** * @brief 이 함수는 새 연결이 열릴 때마다 호출됩니다. * @param client 클라이언트 연결. */void onopen(ws_cli_conn_t 클라이언트) {char *cli;cli = ws_getaddress(client);printf("연결이 열렸습니다. 주소: %sn", cli); }/** * @brief 이 함수는 연결이 닫힐 때마다 호출됩니다. * @param client 클라이언트 연결. */void onclose(ws_cli_conn_t 클라이언트) {char *cli;cli = ws_getaddress(client);printf("연결이 닫혔습니다. 주소: %sn", cli); }/** * @brief 메시지 이벤트가 여기에 들어갑니다. * @param client 클라이언트 연결. * @param msg 메시지 내용. * @param size 메시지 크기. * @param type 메시지 유형. */void onmessage(ws_cli_conn_t 클라이언트,const unsigned char *msg, uint64_t 크기, int 유형) {char *cli;cli = ws_getaddress(client);printf("메시지를 받았습니다: %s (%zu), 보낸 사람: %sn", msg,size, cli);sleep(2);ws_sendframe_txt(client, " 안녕하세요");sleep(2);ws_sendframe_txt(클라이언트, "세계"); }int 메인(void) {/* * 메인 루프, 이 함수는 결코* 반환하지 않습니다. * * *.thread_loop가 != 0이면 새 연결을 처리하기 위해 * 새 스레드가 생성되고 ws_socket()은 * 비차단 상태가 됩니다. */ws_socket(&(struct ws_server){/* * 다음과 같은 호스트 바인딩: * localhost -> localhost/127.0.0.1 * 0.0.0.0 -> 전역 IPv4 * :: -> 전역 IPv4+IPv6(이중 스택) * /.host = "로컬호스트", .port = 8080, .thread_loop = 0, .timeout_ms = 1000, .evs.onopen = &온오픈, .evs.onclose = &온클로즈, .evs.onmessage = &onmessage});return (0); }
위의 예는 다음을 사용하여 작성할 수 있습니다: make examples
.
extra/toyws
내부에는 ToyWS라는 동반 프로젝트가 있습니다. ToyWS는 wsServer와 함께 작동하도록 만들어진 매우 간단하고 멍청한 WebSocket 클라이언트입니다. 극히 제한적이므로 wsServer 이외의 다른 서버에서는 사용을 권장하지 않으며 wsServer와 함께 사용해야 합니다.
이 미니 프로젝트는 wsServer에 대한 지원 역할만 하며 사용자가 wsServer 전체를 사용하기 위해 추가 프로젝트를 사용할 필요가 없습니다.
추가 정보: extra/toyws/README.md
wsServer는 현재 암호화를 지원하지 않습니다. 그러나 기존 프로젝트에 TLS 지원을 추가하는 프록시인 Stunnel과 함께 사용할 수 있습니다. wsServer에서 TLS 지원을 받으려면 다음 네 가지 간단한 단계를 따르십시오.
wsServer는 항상 커뮤니티에 열려 있으며 문제, 문서, 테스트, 새로운 기능, 버그 수정, 오타 등의 기여를 기꺼이 받아들입니다. 참여를 환영합니다. PR을 보내기 전에 코딩 스타일 지침을 읽어보세요.
프로젝트가 도움이 되었나요? 그것에 대해 할 말이 있나요? 여기에 의견을 남겨주세요.
wsServer는 GPLv3 라이선스에 따라 라이선스가 부여됩니다. Davidson Francis 및 기타 기여자가 작성했습니다.