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)

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 : 요청에 대한 응답 전송을 위한 API
  • mg_stop(): 서버종료
  • mg_write : 응답으로 보내는 데이터가 이미지와 같이 크기가 클 경우에 사용되는 API