Erlang

Erlang Web Server V0.1

메롱씨티 배드맨 2012. 4. 12. 14:58



앞서서 설명했던 각 모듈을 결합하여 Web Server를 구성한다.

일단 이 WebServer는 외부 CGI 및 서버사이드 스크립트를 실행하는 기능은 없다.

웹서버상에 미리 만들어진 HTML등의 웹페이지를 보여주는 기능만 갖는다.




                                                     < 크롬 브라우저에서 Erlang Web server 접속 화면 >



192.168.0.125 번 서버에 3001번 Port로 기동되어 있는 Web Server에 접속한 화면이다.

일단 대충 간단하게 index.html 파일을 만들었고, Document Root에 저장한 html 파일을 오픈하여 브라우저에 전송했다.

아래는 서버의 실행 로그이다.






브라우저에서 http://192.168.0.125:3001 로 요청했을 경우 두개의 Request가 서버로 전송된다.

첫번째 요청은 파일명을 넣지 않았기 때문에서 서버에서 index.html로 변환한 후 Document Root 와 결합한 FullPath로 파일을 찾아 읽었다


>> >> file read : "/home/kukto/test/erlang/html/index.html"


이 파일은 정상적으로 브라우저에 전달되었다.

이후 favicon.ico 라는 주소창에 해당 URL의 아이콘을 요청했다.


>> >> file read : "/home/kukto/test/erlang/html/favicon.ico"


ico 파일이 서버에 없기 때문에 서버는 404에러를 반환했을테고, 브라우저는 이 메세지를 무시했다.


아래는 이전에 설명했던 부분을 제외한 Web 기능 구현 부위의 주요 소스 부분이다.






start 함수에서 Server 상수를 저장한 빈 리스트를 생성하고, RPC 변수 프로세서를 실행시킨다.

이후 3001번 포트로 Listen 포트를 함수를 호출한다.


start_parallel_server 함수에서 Port를 열고 listen 대기한다.

par_connect 함수에서 접속 요청을 Accept하고,요청 처리 함수를 호출한다.

get_request함수는 client socket 이벤트를 처리한다.

get_request_from_client 함수에서 Request를 Parsing하여 Server 상수로 저장하고, 이후 Server 상수중 Method 부분으로 파일을 연고

이후 파일에서 읽어들인 부분을 Client로 Send하게 된다.


그런데 문제가 하나 생겼다.

Client 브라우져가 HTTP/1.1 로 접속하여 Connection을 Close를 하지 않다는 것이다.

그래서 저장된 Server 상수를 작업처리후에 지워줘야 하는데, Close 이벤트가 발생하지 않기 때문에 리스트에서 이 상수를 지울 타이밍을 잡을수 없다는 것이다.


그래서 get_request_from_client 함수의 맨마지막에 delList( Pid ) 를 추가함으로써 해결되었음.


'Erlang' 카테고리의 다른 글

Erlang 외부 프로세스 실행  (0) 2012.04.20
Erlang List 변수 처리-로직 변경  (0) 2012.04.09
Erlang 리스트에서 검색값 가져오기  (0) 2012.04.04
Erlang Parsing  (0) 2012.04.04
Erlang List 변수 처리  (0) 2012.03.05