앗! 광고가 차단되었어요!

글 내용이 방문자께 도움이 되었다면, 광고 차단 프로그램 해제를 고려해주세요 😀.

공돌이

C++로 웹서버 만들기

this-gpa 2020. 6. 28. 22:01

[이 글은 2019년 9월에 작성된 글입니다]

 

* C, TCP 관련 웹서버 과제는 아래 링크를 참조하세요.

 

C, TCP 기반으로 간단한 HTTP 서버 작성하기

이 글에서는 대학교 수업 중 "네트워크 프로그래밍"의 단골 과제인, C와 TCP를 기반으로 HTTP 서버를 작성한다. (안타깝게도) "C, C++를 이용한 웹서버"라는 키워드로 블로그 유입이 많이 되고 있어

hello-cruiser.tistory.com

 

안녕하세요. 크루저입니다.

 

C++로 웹서버를 만들다니. 정말 해괴한 경우입니다.

 

하지만 생각해보면 또 C++ 이 빠르기도 하고

(물론 다른 언어들도 빨라져서 운용하는 데에는 문제가 없습니다)

 

그리고 라즈베리파이 같은 보드에서 C++을 쓰면 좋을 것 같아서

C++로 웹서버를 만들어보기로 했습니다.

 

제가 사용해본 라이브러리는 Wt라는 아이입니다.

 

최근에 리눅스를 지워서;; WSL을 사용하고 있는 데, WSL에서도 설치가 잘됩니다.

 

참고 링크: Github우분투 환경에서 설치방법

 

Github 저장소에서는 dependency를 안내하고 있는 데, 아래와 같습니다.

 

Dependencies
To build Wt from source you will need at least CMake (>= 3.1), and boost (version >= 1.50).

Optionally, you may want to add:
OpenSSL for SSL and WebSockets support in the built-in httpd, the HTTP(S) client, and additional cryptographic hashes in the authentication module
Haru PDF library which is used for painting to PDF
GraphicsMagick which is used for painting to PNG, GIF (on Windows, Direct2D can be used instead)
PostgreSQL for the PostgreSQL Dbo backend
MySQL or MariaDB for the MySQL Dbo backend
An ODBC driver for the Microsoft SQL Server Dbo backend, and unixODBC on Unix-like platforms
Firebird for the Firebird Dbo backend
Pango for improved font support in PDF and raster image painting. On Windows, DirectWrite can be used instead.
ZLib for compression in the built-in httpd.
For the FastCGI connector, you also need:
FastCGI development kit: you need the C/C++ library (libfcgi++)

cmake, boost, GraphicsMagick은 설치 과정에서 이미 언급이 되어있고,

나머지는 추가로 설치해야 하는 걸로 알고 있습니다. 다음은 우분투의 apt 패키지 이름입니다.

haru pdf: libhpdf-dev
mysql: libmysqlclient-dev
pango: libpango-1.0.0 / libpangoft2-1.0.0
zlib: zlib1g-dev

그리고 빌드 할 때 Qt까지 설치해달라는 메시지가 나오기도 하는데요 ;-;

저 같은 경우는 Qt를 설치했습니다.

다만 WSL의 경우 별도의 display가 없기 때문에 X11을 이용해 설치해야 합니다.

 

참고 링크: X11 with WSL, Qt 설치 방법

 

make, ldconfig 후 예제 소스를 컴파일하면 됩니다. (시간이 많이 걸리지는 않네요)

아래는 단일 파일 main.cpp를 컴파일 시 사용했던 명령어입니다.

g++ -o serv.wt main.cpp -lwt -lwthttp

만약 컴파일 시 에러가 발생하면 이 스레드1, 스레드2를 참고해보세요.

 

실행할 때도 인자가 꽤 있습니다 ;-;

./serv.wt --docroot . --http-listen 0.0.0.0:8080

잘 작동하네요. 어디까지 응용이 될지 기대가 됩니다.

마지막으로, 저는 WSL과 vscode를 사용하는 데, 헤더가 인식이 안될 때가 있습니다.

그때는 Compiler Path를 g++, IntelliSense mode를 gcc-x64로 바꿔주면 잘 작동합니다.

적용 방법은 VSCode에서 안내하고 있어요!

 

아주 잘 작동합니다.

다음에는 ARM Cross Compiling이나, Wt에 신기한 기능들이 있으면 가져올 것 같아요.

그럼 Wt 개발, 파이팅입니다!!