CivetWeb
CivetWeb
c/c++ 어플리케이션에 내장하여 사용하기위한 오픈소스 임베디드용 웹서버.
https://github.com/civetweb/civetweb
CivetWeb 특징
- MIT 라이센스
- Windows, Mac, Linux, UNIX, iPhone, Android 여러 플랫폼에서 사용 가능
- CGI, SSI, HTTP digest (MD5) 인증, WebSocket 지원
- OpenSSL을 사용하여 HTTPS(SSL/TLS) 지원
- Windows service 형태로 실행 가능
- Websocket 클라이언트 기능 사용 가능 (WS/WSS)
CivetWeb 내장하여 사용하기
c/c++ 어플리케이션 내에 civetweb을 내장하여 웹서비스를 제공하고, 자동화 또는 원격제어를 위한 HTML5 데이터를 시각화할 수 있는 인터페이스(Web UI)를 제공할 수 있다.
내가 사용했던 civetweb 소스코드는 예전 버전(v1.1)이라 OpenSSL 1.0 라이브러리(ssleay32.dll, libeay32.dll
)를 사용했지만 현재(1.14)는 3.0 버전까지 지원하는 것으로 보인다.
아래는 civetweb 1.1 을 사용하면서 필요했던 내용과 주로 사용했던 API들…
- HTTPS 지원
- OpenSSL로 인증서 파일을 생성
- 생성한 인증서 파일명 및 경로는 civetweb.c 코드의 내용과 동일해야한다. ssl 관련 에러가 나는 경우에 civetweb.c의
set_ssl_option()
함수에서 인증서 파일이 제대로 로드되는지 확인! - 배포시에는 OpenSSL 라이브러리도 함께 배포해야 모든 환경에서 정상 동작할 수 있다.
- jsoncpp 라이브러리로 GET 메소드로 온 요청에 대한 응답의 상세 정보는 json data 형식으로 실어서 보낸다.
- multipart 전송 (multipart/x-mixed-replace)
- 실시간 영상 전송 및 서버푸쉬 기능을 구현할 수 있다.
- HTTP 헤더 :
Content-Type: multipart/x-mixed-replace;boundary=--myboundary\n
(boundary는 전송하는 연속되는 데이터의 분리자) - https://developpaper.com/using-multipart-x-mixed-replace-to-realize-http-real-time-video-streaming/
CivetWeb APIs
mg_start()
: 서버시작- 콜백함수(mg_callbacks.begin_request)를 등록하여 해당 함수에서 HTTP 요청을 받아 처리할 수 있도록 함
- port, document root 경로 등을 전달하는 옵션 파라미터 전달
mg_get_header
: HTTP/HTTPS 요청 헤더 구문에서 ‘Accept-Encoding’, ‘Content-Type’와 같은 특정한 항목에 대한 값을 가져올 수 있다.mg_get_request_info
: 콜백에서 받은 클라이언트 요청을 ‘mg_request_info’ 형태로 리턴한다.mg_get_var
: ‘mg_get_request_info’ API 호출을 통해 얻은 mg_request_info 구조체의 query_string 값을 인자로 호출하면 POST 메소드로 들어온 요청에서 파라미터 값(URL상에서 ‘?’ 이후의 문자열)을 뽑아낼 수 있다.mg_printf
: 요청에 대한 응답 전송을 위한 APImg_stop()
: 서버종료mg_write
: 응답으로 보내는 데이터가 이미지와 같이 크기가 클 경우에 사용되는 API