<네트워크> 1Kb 초소형 웹서버 구조 -가을남자 덕현-
웹서버 기능 1.html/htm 웹페이지 처리/전송 2. jpg/gif 등 이미지 파일 전송 3. 다중 접속 기능 4. Zip 등 압축파일 전송 5. 최소한의 http 프로토콜 처리(get, ok) 1 2 3 4
코 드 흐 름 도 전체 Flow chart
How to minimize the size of code? 총 7단계 절차: 7kb->1kb 1. IE, FireFox 등 상용 브라우저의 우수성? "HTTP/1.0 200 OK\r\n“와 "Content-type:text/plain\r\n\r\n" 두 가지 메타데이터만 전송하도록 했다. (1kb 정도 줄일 수 있다) 2. 다양한 컴파일러 선택 3. 엔트리포인트 강제 지정(2kb 정도 줄일 수 있다) 4. 파일 정렬(alignment) (0.5kb 정도 줄일 수 있다) 5. 섹션 합병(merging)(2kb 정도 줄일 수 있다) 6. VC6 버전 cl.exe(컴파일러) 이용함 7. c 기본 라이브러리 사용을 배제하고 win 32 api 라이브러리 이용 (0.5kb 정도 줄일 수 있다)
똑똑한 익스플로러와 파이어폭스? 파싱, send,저장 에 필요한 추가적인 함수호출, string 클래스 사용 줄어듬 원래 ‘원칙적으로’ 전송해야 하는 메타 데이터들 send(cS, "HTTP/1.0 200 OK\r\n", 17, 0) send(sock, "My web Server\r\n", 15, 0) send(sock, "Content-length:1024\r\n", 21, 0) send(cS, "Content-type:text/plain\r\n\r\n",27, 0) 테스트 결과 두 가지만 전송해도 상용 웹브라우저는 알아듣는다. 파싱, send,저장 에 필요한 추가적인 함수호출, string 클래스 사용 줄어듬
어느 컴파일러가 가장 우수할까? Dev++ 내장 컴파일러(약24kb) VC2008의 cl.exe(약 7kb) Gcc 컴파일러(약 7.2kb) Lcc 컴파일러(약 32kb) ※컴파일 옵션에 따라 다소 차이가 날 수 있음 . 파일 포맷 merging과 파일 alignment를 수행하지 않았을 때 .
엔트리 포인트 강제 지정 엔트리 포인트란? 따라서 강제로 이러한 절차를 뛰어넘고 사용자가 프로그램을 실행했을때, 코드에서의 프로그램의 시작 지점 c/c++ 프로그램에서는 당연히 main 함수부분이 엔트리 포인트가 되나 사실은 그전에 내부적으로 내부에서 main 전에 커맨드 라인 인자, 프로그램 초기화 등을 수행한 이후에 main 함수를 호출한다. 따라서 강제로 이러한 절차를 뛰어넘고 (argv[] 커맨드 입력을 사용하지 않는다면)main 함수부터 바로 프로그램 실행이 되도록 지정을 해서, 메모리 약 2kb 정도를 절약할 수 있다. #pragma comment(linker,"/ENTRY:main") //링커에게 코드의 엔트리 포인트는 main 이라고 명시적으로 알려준다
파일 정렬 및 합병 Server.exe파일의 구조 PE 파일 포맷 섹션으로 나뉘어져 있고 각 섹션마다 극히 드문경우를 제외하고 섹션 뒤에 빈공간이 생길 수 밖에 없다 #pragma comment(linker, "/FILEALIGN:4") #pragma comment(linker, "/ALIGN:4") // Merge sections #pragma comment(linker,/MERGE:.rdata=.data") #pragma comment(linker, "/MERGE:.text=.data") #pragma comment(linker, "/MERGE:.reloc=.data")
C 기본 라이브러리 함수 VS win 32 api 함수 stdio.h 와 Stdlib.h 에 포함된 원래 사용했던 함수 Printf() Fopen() Fread() Memset() Exit() Windows.h 에 포함된 Win 32API의 기본함수들 Wprintf() CreateFile() ReadFile() zeroMemory() ExitProcess() VS #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #include <windows.h> 헤더파일 두 개만 include
닷넷 프레임워크 종속성 우리 웹서버가 VC 2008 이나 VC2010가 깔려있지 않는 시스템에서 동작하지 않는다면? -VC6로 빌드한 코드는 윈도우 기본 dll만 사용하기 때문에 닷넷 프레임워크 (2005이상)이 깔려있지 않는 시스템 환경에서도 동작한다 VC6 컴파일러는 사용자에게 매우 관대하다! 다소 무리한 파일 병합,정렬도 받아준다
정리하면