[CS] Tiny Web Server κ΅¬ν˜„

🧠·2022λ…„ 5μ›” 16일
0

CS

λͺ©λ‘ 보기
4/4

Tiny Web Server κ΅¬ν˜„


Cμ–Έμ–΄λ₯Ό 기반으둜 λ¦¬λˆ…μŠ€ μ„œλ²„μ—μ„œ μ†ŒμΌ“ μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν™œμš©ν•œ μ•„μ£Ό μž‘μ€ μ›Ή μ„œλ²„λ₯Ό κ΅¬ν˜„ν•΄λ³΄κ³ μž ν•œλ‹€.

μ†ŒμΌ“(Socket)μ΄λž€?

  • λ„€νŠΈμ›Œν¬μƒμ—μ„œ λ™μž‘ν•˜λŠ” ν”„λ‘œκ·Έλž¨ κ°„ ν†΅μ‹ μ˜ End-Point
  • ν”„λ‘œκ·Έλž¨μ΄ λ„€νŠΈμ›Œν¬μ—μ„œ 데이터λ₯Ό μ†‘μˆ˜μ‹ ν•  수 μžˆλ„λ‘ μ—°κ²°ν•΄μ£ΌλŠ” λ„κ΅¬λ‘œμ¨ μΈν„°νŽ˜μ΄μŠ€ 역할을 ν•œλ‹€

λ¦¬λˆ…μŠ€μ—μ„œ μ†ŒμΌ“μ€ 파일 ν˜•νƒœλ‘œ 닀루어지며 ν”„λ‘œμ„ΈμŠ€λŠ” 이 μ†ŒμΌ“μ„ μ‚¬μš©ν•  λ•Œ νŒŒμΌλ””μŠ€ν¬λ¦½ν„°λ₯Ό 톡해 μ‚¬μš©ν•œλ‹€.

파일 λ””μŠ€ν¬λ¦½ν„°λž€?

File Descriptor

  • μ‹œμŠ€ν…œμœΌλ‘œλΆ€ν„° ν• λ‹Ή 받은 νŒŒμΌμ„ λŒ€ν‘œν•˜λŠ” 0이 μ•„λ‹Œ μ •μˆ˜ κ°’
    - μœ λ‹‰μŠ€ μ‹œμŠ€ν…œμ—μ„œ λͺ¨λ“  μž₯μΉ˜λ“€μ„ 파일둜 관리, λ‚΄μ™ΈλΆ€ λͺ¨λ“  μž₯μΉ˜λ„ 파일둜 μ·¨κΈ‰ν•œλ‹€.
  • 일반 파일, 디렉토리, Socket, PIPEλ“± ν”„λ‘œμ„ΈμŠ€κ°€ μ΄λŸ¬ν•œ νŒŒμΌλ“€μ— μ ‘κ·Όν•  λ•Œ File DescriptorλΌλŠ” κ°œλ…μ„ μ΄μš©ν•œλ‹€.

socket

  • socket() ν•¨μˆ˜λ₯Ό μ΄μš©ν•˜μ—¬ socket을 μƒμ„±ν•˜κ³  파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό 리턴 λ°›λŠ”λ‹€.
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

parameter

  • int domain: μ–΄λ–€ μ˜μ—­μ—μ„œ 톡신할 것인지 (IPv4 or IPv6 or ...)
  • int type: μ–΄λ–€ μ„œλΉ„μŠ€ νƒ€μž…μ˜ μ†ŒμΌ“ (TCP or UDP or ...)
  • int protocol: μ†ŒμΌ“μ—μ„œ μ‚¬μš©ν•  ν”„λ‘œν† μ½œ (TCP or UDP / typeμ—μ„œ 미리 정해진 경우 0)

return value

  • -1: μ†ŒμΌ“ 생성 μ‹€νŒ¨
  • 3 μ΄μƒμ˜ κ°’: μ†ŒμΌ“ 생성 μ„±κ³΅μ‹œ μ†ŒμΌ“μ„ κ°€λ¦¬ν‚€λŠ” μ†ŒμΌ“ λ””μŠ€ν¬λ¦½ν„°λ₯Ό λ°˜ν™˜

bind

  • socket() ν•¨μˆ˜λ₯Ό 톡해 μƒμ„±λœ μ†ŒμΌ“μ— μ„œλ²„μ˜ 정보λ₯Ό λ¬Άμ–΄μ£ΌλŠ” ν•¨μˆ˜ (IP μ£Όμ†Œμ™€ μ†ŒμΌ“ λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ—°κ²° μ‹œμΌœμ€€λ‹€.)
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

parameter

  • int sockfd: μƒμ„±λœ μ†ŒμΌ“μ˜ νŒŒμΌλ””μŠ€ν¬λ¦½ν„°
  • struct sockaddr *myaddr: μ„œλ²„μ˜ IP μ£Όμ†Œ
  • socklen_t addrlen: IP μ£Όμ†Œ 길이

return value

  • -1: μ‹€νŒ¨
  • 0: 성곡

listen

  • μ™ΈλΆ€μ—μ„œ μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œ μˆ˜λ½ν•  수 μžˆλŠ” λŒ€κΈ°μƒνƒœμ— λ“€μ–΄κ°€λŠ” ν•¨μˆ˜
#include <sys/socket.h>
int listen(int sockfd, int backlog);

parameter

  • int sockfd: μƒμ„±λœ μ†ŒμΌ“μ˜ νŒŒμΌλ””μŠ€ν¬λ¦½ν„°
  • int backlog: μ—°κ²° λŒ€κΈ°μ—΄μ˜ 크기

return value

  • -1: μ‹€νŒ¨
  • 0: 성곡

accept

  • ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μš”μ²­μ΄ 듀어왔을 λ•Œ μ„œλ²„μ™€ μ—°κ²°μ‹œμΌœμ£ΌλŠ” ν•¨μˆ˜
#include <sys/socket.h>
int listen(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

parameter

  • int sockfd: μƒμ„±λœ μ†ŒμΌ“μ˜ νŒŒμΌλ””μŠ€ν¬λ¦½ν„°
  • struct sockaddr *addr: ν΄λΌμ΄μ–ΈνŠΈ μ£Όμ†Œ 정보
  • socklen_t *addrlen: 2번째 인자의 길이

Tiny.c

main ν•¨μˆ˜

0개의 λŒ“κΈ€