Skip to content

Jikang Branch Report

PennyBlack2008 edited this page May 3, 2021 · 11 revisions

Feat: localhost 100 으로 연결하면, 404 error 를 수신받고 testcase 경로에 있는 샘플 파일의 내용을 send 한다.

Flaw: Makefile 시 목적파일이 중복으로 생성됨. issue #13 fixed by Yunslee 20210422

WHAT?

http message 을 서버 종료 없이 반복적으로 받을 수 있는 서버로직 작성.

issue #8

통신소켓으로부터 buffer 를 여러번 read 하여 받아올 수 있도록 만들었음. 하지만 buffer 를 합치는 과정은 전혀 넣지 않아, 테스트해볼 때 한번에 buffer 를 받아올 수 있도록 buffer 크기를 100 이상으로 충분히 크게 만들고 해야함.

아래의 코드로 모든 소켓에 있는 내용을 읽고 무한루프를 빠져나올 수 있음.

while (bytesRead == BUFFER_SIZE - 1)
{
	memset(buffer, 0, BUFFER_SIZE);
	bytesRead = read(connections, buffer, BUFFER_SIZE - 1);
	if (bytesRead == -1)
		std::cerr << "Could not read request." << std::endl;
}

무한 루프 안에 통신 소켓을 읽고, 통신 소켓을 삭제하는 절차가 들어있음.

  • 추가된 기능

    • 아래의 두가지 조건을 만족했을 시, 여러번 새로 고침을 해도 정상적으로 <h1>Hello World</h1><h1>This is 200 OK!</h1> 가 실행됨.
      • -fsanitize=address 옵션 제거한 후 컴파일 해야함.
        • 그렇지 않으면 segfault
        • 그런데, 가끔은 이 옵션을 넣어도 실행이 잘 된다.
      • buffer 가 어렴풋이 100 이상 충분히 커야 실행 가능하다.
        • 그렇지 않으면 segfault
  • 변경한 이름

    • Socket(port, ip) 의 인자 순서를 Socket(ip, port) 로 변경하였음.

WHY?

이 로직을 바탕으로 팀원들이 일치된 로직으로 본인의 로직을 테스트해볼 수있음

TESTING

첫 번째)

Socket socket(80, INADDR_ANY); 에 각각 포트 번호, IPv4 주소를 넣는다. make 후, ./webserv 실행파일을 실행하고 safari secret 모드로 들어가 해당 IP 와 port 번호로 접속한다. ex) localhost:80 터미널에 받아온 HTTP 요청 출력을 확인한다.

두 번째)

-fsanitize=address의 비활성화유무 와 buffer 가 100 이상인지 확인한다. 그리고 make 하여 실행한 뒤, 새로고침을 확인한다.

추가설명

##요청사항

모자른 부분 달아주세요.

WHAT?

Sujung 님과 Minckim 님의 main 문을 카피하여 그 main 문에 맞춰 지금까지 짠 코드를 수정하였음.

추가된 기능

  • main 문에 try, catch 문
  • 전체적인 소켓을 관리하는 Webserver 클래스 만들었음.
    • 지금까지의 main.cpp 에 있는 로직이 Webserver.cpp 의 start_server 메소드에 있다고 생각하면된다.

WHY?

Sujung 님과 Minckim 님의 팀과 비슷한 로직을 함께 가려면 이렇게 가장 기초적인 메인문 부터 맞춰야한다고 생각했음.

TESTING

똑같이 make 를 하여 컴파일을 하면 되고, -fsanitize=address 옵션은 꺼줘야 제대로 새로고침이 가능하게 된다.

개선해야할 사항

코딩 컨벤션을 제대로 맞추지 않았음. 일단 계속 수정해야할 일이 생기는 것같고 지금 로직이 어느정도 폼이 올라오지는 않았는 데 계속 수정하면서 하면 스트레스 받아서 나중에 하고 싶음.

또한, Select 를 넣어서 멀티 플랙싱을 시도해야함.

WHAT?

start_serverstart_serversstart_a_server 로 나누었음.

  • start_servers 에서는 select 가 소켓들을 감시하기 위한 코드
  • start_a_server 에서는 서버 소켓에서 버퍼를 받으며 requestresponse 를 하는 함수를 넣었음.

기타 사항

Socket::Accept 에 들어있던 int connection 파라미터를 int client 클래스 변수로 바꿨음. resolved #27

readfds 를 모든 클래스함수에서 접근할 수 있도록 클래스 변수로 바꿨음.

WHY?

start_server 가 서버 여러개를 돌리는 데, 그 이름에 걸맞지 않게 모든 server 를 제어하고 너무 코드수가 많기 때문에 start_servers 로 이름을 변경하고 코드를 나눌 필요가 있었음.

TESTING

make 로 수행해서 이전과 똑같이 8000, 8001, 8002 번이 잘 작동하는 지 확인한다. 특별히 기능을 추가한 것은 없다.

개선해야할 사항

request 와 response 로 클라이언트와 주고 받게 된다면 진정한 멀티플랙싱을 구현해야할 때가 올 것임. 지금은 클라이언트 소켓에서 request 를 받고 끝나지만, 클라이언트 소켓에서 request 를 주고 받는 것을 반복적으로 가능하게 하려면, readfds 에 클라이언트 소켓을 추가해야할 것이다. 그리고 클라이언트 소켓에서 연결이 끊어진 상태라면, readfds 에서 FD_CLR 을 사용하여 readfds 에서 클라이언트 소켓을 제거해야한다.

아직 공부가 충분하지 못해서 이 부분이 감이 안잡히는 데, 일단 request 와 response 에 대한 충분한 이해가 있어야 그림이 나올 것같아서 그것부터 공부를 해보겠음.