-
Notifications
You must be signed in to change notification settings - Fork 1
Jikang Branch Report
20210422 Feat: 소켓 메인로직 프로토타입 작성
Feat: localhost 100 으로 연결하면, 404 error 를 수신받고 testcase 경로에 있는 샘플 파일의 내용을 send 한다.
Flaw: Makefile 시 목적파일이 중복으로 생성됨. issue #13 fixed by Yunslee 20210422
20210428 Feat: 새로 고침 및 버퍼 나누어 받기 구현
http message 을 서버 종료 없이 반복적으로 받을 수 있는 서버로직 작성.
통신소켓으로부터 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) 로 변경하였음.
이 로직을 바탕으로 팀원들이 일치된 로직으로 본인의 로직을 테스트해볼 수있음
첫 번째)
Socket socket(80, INADDR_ANY);
에 각각 포트 번호, IPv4 주소를 넣는다.
make 후, ./webserv
실행파일을 실행하고 safari secret 모드로 들어가 해당 IP 와 port 번호로 접속한다.
ex) localhost:80
터미널에 받아온 HTTP 요청 출력을 확인한다.
두 번째)
-fsanitize=address
의 비활성화유무 와 buffer 가 100 이상인지 확인한다. 그리고 make 하여 실행한 뒤, 새로고침을 확인한다.
##요청사항
모자른 부분 달아주세요.
Sujung 님과 Minckim 님의 main 문을 카피하여 그 main 문에 맞춰 지금까지 짠 코드를 수정하였음.
추가된 기능
- main 문에 try, catch 문
- 전체적인 소켓을 관리하는 Webserver 클래스 만들었음.
- 지금까지의 main.cpp 에 있는 로직이 Webserver.cpp 의 start_server 메소드에 있다고 생각하면된다.
Sujung 님과 Minckim 님의 팀과 비슷한 로직을 함께 가려면 이렇게 가장 기초적인 메인문 부터 맞춰야한다고 생각했음.
똑같이 make 를 하여 컴파일을 하면 되고, -fsanitize=address 옵션은 꺼줘야 제대로 새로고침이 가능하게 된다.
코딩 컨벤션을 제대로 맞추지 않았음. 일단 계속 수정해야할 일이 생기는 것같고 지금 로직이 어느정도 폼이 올라오지는 않았는 데 계속 수정하면서 하면 스트레스 받아서 나중에 하고 싶음.
또한, Select 를 넣어서 멀티 플랙싱을 시도해야함.
start_server
를 start_servers
와 start_a_server
로 나누었음.
-
start_servers
에서는select
가 소켓들을 감시하기 위한 코드 -
start_a_server
에서는 서버 소켓에서 버퍼를 받으며request
와response
를 하는 함수를 넣었음.
기타 사항
Socket::Accept
에 들어있던 int connection
파라미터를 int client
클래스 변수로 바꿨음. resolved #27
readfds
를 모든 클래스함수에서 접근할 수 있도록 클래스 변수로 바꿨음.
start_server
가 서버 여러개를 돌리는 데, 그 이름에 걸맞지 않게 모든 server
를 제어하고 너무 코드수가 많기 때문에 start_servers
로 이름을 변경하고 코드를 나눌 필요가 있었음.
make 로 수행해서 이전과 똑같이 8000, 8001, 8002 번이 잘 작동하는 지 확인한다. 특별히 기능을 추가한 것은 없다.
request 와 response 로 클라이언트와 주고 받게 된다면 진정한 멀티플랙싱을 구현해야할 때가 올 것임. 지금은 클라이언트 소켓에서 request 를 받고 끝나지만, 클라이언트 소켓에서 request 를 주고 받는 것을 반복적으로 가능하게 하려면, readfds 에 클라이언트 소켓을 추가해야할 것이다. 그리고 클라이언트 소켓에서 연결이 끊어진 상태라면, readfds 에서 FD_CLR 을 사용하여 readfds 에서 클라이언트 소켓을 제거해야한다.
아직 공부가 충분하지 못해서 이 부분이 감이 안잡히는 데, 일단 request 와 response 에 대한 충분한 이해가 있어야 그림이 나올 것같아서 그것부터 공부를 해보겠음.