Jikang Branch Report - 404-DriverNotFound/200-OK GitHub Wiki

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_server λ₯Ό start_servers 와 start_a_server 둜 λ‚˜λˆ„μ—ˆμŒ.

  • start_servers μ—μ„œλŠ” select κ°€ μ†ŒμΌ“λ“€μ„ κ°μ‹œν•˜κΈ° μœ„ν•œ μ½”λ“œ
  • start_a_server μ—μ„œλŠ” μ„œλ²„ μ†ŒμΌ“μ—μ„œ 버퍼λ₯Ό λ°›μœΌλ©° request 와 response λ₯Ό ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ„£μ—ˆμŒ.

기타 사항

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 에 λŒ€ν•œ μΆ©λΆ„ν•œ 이해가 μžˆμ–΄μ•Ό 그림이 λ‚˜μ˜¬ κ²ƒκ°™μ•„μ„œ 그것뢀터 곡뢀λ₯Ό ν•΄λ³΄κ² μŒ.

⚠️ **GitHub.com Fallback** ⚠️