기존의 코드에서는, 요청을 받은 후 일정 시간이 지나면 무한루프에 들어가며 동작을 멈추는 문제가 있었다.
일반적으로 HTTP
에서는 클라이언트가 요청을 보내면 서버는 응답을 보내고 연결을 종료한다. 이 때 연결이 제대로 끊어지지 않았다면 서버는 계속하여 클라이언트에게서 값을 받아들이려 할 것이고, 바로 여기서 문제가 발생했을 거라 생각했다.
doit
함수 뒤에는 바로 클라이언트와의 연결을 끊어주는 Close
가 위치한다. 그렇다면 doit
내부의 로직이 문제의 원인이 아닐까?
기존의 Rio_readlineb(&rio, buf, MAXLINE)
는 클라이언트로부터의 요청 헤더를 읽어오는 데에 사용된다. 이 부분을 수정하여 요청을 받아오지 못했다면 바로 return
하여 doit
을 종료시켜버리게 수정해보았다.
void doit(int fd) {
...
Rio_readlineb(&rio, buf, MAXLINE);
...
}
void doit(int fd) {
...
if(!(Rio_readlineb(&rio, buf, MAXLINE))){
return;
}
...
}
이후 해당 문제는 지금까지 확인되지 않았다 😎