학습 | 서브젝트(Mandatory)

자, 이제야 서브젝트를 읽는군요. RFC까지 읽으셨다면 서브젝트를 읽는 데 큰 무리가 없습니다. Mandatory Part를 한 번 같이 보시죠.

가급적이면 Mandatory Part를 읽기 전에 허용되는 함수들에 대한 학습을 먼저 하시기를 권장합니다.

  • You must write a HTTP server in C++ : : C++로 HTTP 서버를 작성합니다. HTTP 프로토콜을 따르는 서버를 만들어야 한다는 것을 얘기하지만, C++로 작성해야 한다는 것 역시도 의미합니다. 파일 확장자가 cpp라 하더라도 객체 지향적으로 만들지 않고 c style로 만들 경우 이 항목에 위배될 수 있습니다.

  • It must be conditionnal compliant with the rfc 7230 to 7235 (http 1.1) but you need to implement only the following headers. You can implement all the headers if you want to. : RFC 7230부터 7235까지의 문서를 조건적으로 만족시키는 프로그램을 만들어야 합니다. 헤더의 경우 서브젝트에 명기된 헤더들만 취급해도 됩니다. 물론 원한다면 다른 헤더들까지 다 구현해도 됩니다.

  • We will consider that nginx is HTTP 1.1 compliant and may be use to compare : nginx가 HTTP/1.1을 만족하는 것으로 간주하기 때문에,

    HTTP/1.1이 어떻게 동작하는가에 대해서 의문이 있을 경우 nginx와 비교하여 구현하면 됩니다.

  • It must be non blocking and use only 1 select for all the IO between the client and the server (listens includes). : 서버는 특정 클라이언트와의 IO작업에 묶여서는(blocking) 안 되며, 모든 클라이언트와의 작업에 있어서 select 함수를 단 1번만 사용하여 관리하여야 합니다. select 함수는 특정 fd에 대해 읽기나 쓰기 작업이 가능한지를 체크하는 함수인데요. 클라이언트 단위로 해당 함수를 실행하는 것이 아니라 모든 클라이언트 정보를 한 번에 인자로 주어 select 함수를 1회 실행하여, '현재 연결되어 있는 클라이언트 가운데 리퀘스트를 보내려고 하는 클라이언트는 O랑 O이고, 응답을 받을 준비가 되어 있는 클라이언트는 O와 O이구나'를 감지하라는 의미입니다.

  • Select should check read and write at the same time. : 위의 연장으로, 요청을 읽을 수 있는지를 감지하는 작업과 응답을 보낼 수 있는지를 감지하는 작업을 별개로 하지 말고 select를 실행할 때 동시에 감지하라는 의미입니다.

  • Your server should never block and client should be bounce properly if necessary : 서버가 죽거나, 멈추거나, 클라이언트에 묶여서는 안 되며 필요하다면 클라이언트를 튕겨낼 수 있습니다. 이것은 서버를 보호하기 위한 예외처리에 대한 언급일 뿐, 이 조항을 기회로 보고 특정한 경우에 요청을 처리하지 않아도 되도록 코드를 구현하면 테스터를 통과할 수 없습니다.

  • You should never do a read operation or a write operation without going through select : select 작업으로 읽기 작업이나 쓰기 작업이 가능한지 확인하지 않은 상태에서 입출력 작업을 진행해서는 안 됩니다. 가능하더라도 한 번만 해야 합니다.

  • Checking the value of errno is strictly forbidden after a read or a write operation : read/write 작업 뒤에 errno를 체크하여 예외처리를 진행하는 것은 엄격히 금지됩니다. 에러가 발생하면 에러의 원인과 관계없이 클라이언트가 제거되어야 합니다.

  • A request to your server should never hang forever : 어떤 이유로든 리퀘스트가 처리되지 않고 서버에 남아있어서는 안 됩니다.

  • You server should have default error pages if none are provided : 필요한 경우 상황에 맞는 에러 페이지를 리턴할 수 있도록 합니다. 그러나 제공해야 할 마땅할 에러 페이지가 없을 때 서버가 사용하는 디폴트 에러 페이지를 따로 가지고 있어야 합니다.

  • Your program should not leak and should never crash, (even when out of memory if all the initialisation is done) : 당신의 프로그램은 memory leak이나 crash를 일으키면 안 됩니다.

  • You can’t use fork for something else than CGI (like php or perl or ruby etc...) : php, perl, ruby와 같이 다른 언어로 작성된 CGI 프로그램을 실행하는 경우를 제외하고 fork를 사용할 수 없습니다.

  • You can include and use everything in "iostream" "string" "vector" "list" "queue", "stack" "map" "algorithm" : 허용 외부 함수와 관계없이 iostream, string, vector, list, queue 라이브러리의 모든 함수를 사용할 수 있습니다. iofstream은 안 된다는 점에 대해 주의합니다.

  • Your program should have a config file in argument or use a default path : 인자로 configuration file을 받으며, 인자가 주어지지 않을 때에는 default path로 지정한 위치의 configuration 파일을 사용합니다.

일반적으로 fd에 대해 write/read 작업을 실행하면 block(상대 측이 읽거나 쓰기를 시작/완료할 때까지 대기하는 현상)이 되기 쉽습니다. mac os는 다른 os와 입출력 함수 작동 방식이 다르기 때문입니다.

이 이슈를 해결하기 위해, 그리고 non-block 프로그래밍을 하기 위해 fd의 속성을 바꿀 수 있는 fcntl 함수를 허용합니다. 따라서fcntl(fd, F_SETFL, O_NONBLOCK)와 다르게, 다른 플래그를 이용하여 fcntl 함수를 사용하는 경우는 엄격히 금지됩니다.

Last updated