๐ฅ๏ธ ๊ฐ๋จํ ์น ์๋ฒ ๊ตฌํ: C์ธ์ด๋ก ์์ํ๋ ์๋ฒ ํ๋ก๊ทธ๋๋ฐ ์ฌํ ๐

์๋ ํ์ธ์, ๋ฏธ๋์ ์น ์๋ฒ ๋ง์คํฐ๋ค! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ์๊ฐ์ ๋ณด๋ด๋ ค๊ณ ํด์. ๋ฐ๋ก C์ธ์ด๋ฅผ ์ฌ์ฉํด ๊ฐ๋จํ ์น ์๋ฒ๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ๐
์ฌ๋ฌ๋ถ, ํน์ ์น ์๋ฒ๊ฐ ๋ญ์ง ์์๋์? ๋ค, ๋ง์์! ์น ์๋ฒ๋ ์ฐ๋ฆฌ๊ฐ ์ธํฐ๋ท์ ํตํด ์น์ฌ์ดํธ๋ฅผ ๋ณผ ์ ์๊ฒ ํด์ฃผ๋ ๋ง๋ฒ ๊ฐ์ ํ๋ก๊ทธ๋จ์ด์์. ๊ทธ๋ฆฌ๊ณ ์ค๋, ์ฐ๋ฆฌ๋ ์ด ๋ง๋ฒ์ ๋น๋ฐ์ C์ธ์ด๋ก ํ์ด๋ผ ๊ฑฐ์์!
์ด ์ฌ์ ์ ํตํด ์ฌ๋ฌ๋ถ์ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ด๋ถํฐ ์ค์ ๋์ํ๋ ์น ์๋ฒ๋ฅผ ๋ง๋๋ ๊ณผ์ ๊น์ง ๋ชจ๋ ๊ฒฝํํ๊ฒ ๋ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
์, ๊ทธ๋ผ ์ฐ๋ฆฌ์ ์๋ฒ ๊ตฌํ ๋ชจํ์ ์์ํด๋ณผ๊น์? ์์ ๋ฒจํธ ๊ฝ ๋งค์ธ์. ์ด์ ์ถ๋ฐํฉ๋๋ค! ๐
๐ ์น ์๋ฒ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ดํดํ๊ธฐ
์ฐ๋ฆฌ์ ์ฌ์ ์ ์์ํ๊ธฐ ์ ์, ๋จผ์ ์น ์๋ฒ๊ฐ ์ ํํ ๋ฌด์์ธ์ง ์์๋ณผ ํ์๊ฐ ์์ด์. ์น ์๋ฒ๋ ๋จ์ํ ๋งํด์ ํด๋ผ์ด์ธํธ(์ฃผ๋ก ์น ๋ธ๋ผ์ฐ์ )์ ์์ฒญ์ ๋ฐ์ ์ฒ๋ฆฌํ๊ณ , ๊ทธ์ ๋ํ ์๋ต์ ๋ณด๋ด์ฃผ๋ ํ๋ก๊ทธ๋จ์ด์์.
์น ์๋ฒ์ ์ฃผ์ ๊ธฐ๋ฅ์ ๊ฐ๋จํ ์ ๋ฆฌํด๋ณผ๊น์?
- ํด๋ผ์ด์ธํธ์ HTTP ์์ฒญ ์์
- ์์ฒญ๋ ๋ฆฌ์์ค(HTML ํ์ผ, ์ด๋ฏธ์ง ๋ฑ) ์ฐพ๊ธฐ
- ์ ์ ํ HTTP ์๋ต ์์ฑ
- ํด๋ผ์ด์ธํธ์๊ฒ ์๋ต ์ ์ก
์ด๋ฐ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ๋ค์ C์ธ์ด๋ก ๊ตฌํํ๋ฉด์, ์ฐ๋ฆฌ๋ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ ๊ฐ๋ ๋ค์ ์์ฐ์ค๋ฝ๊ฒ ์ตํ๊ฒ ๋ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์ ๋ฌธ๊ฐ๋ก๋ถํฐ 1:1๋ก ๋ฐฐ์ฐ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
๐ ์์๋์ธ์: ์น ์๋ฒ๋ 24์๊ฐ 365์ผ ์ฌ์ง ์๊ณ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ด์. ๋ง์น ํญ์ ์ด๋ ค์๋ ์จ๋ผ์ธ ์์ ์ฒ๋ผ์!
์ด์ ์น ์๋ฒ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํ์ผ๋, ๋ณธ๊ฒฉ์ ์ผ๋ก C์ธ์ด๋ก ๊ตฌํ์ ์์ํด๋ณผ๊น์? ์ฌ๋ฌ๋ถ์ ์ฝ๋ฉ ์ค๋ ฅ์ด ํ ๋จ๊ณ ์ ๊ทธ๋ ์ด๋๋ ์ค๋น๋ฅผ ํ์ธ์! ๐
๐ ๏ธ C์ธ์ด๋ก ์น ์๋ฒ ๊ตฌํํ๊ธฐ: ์ฒซ ๊ฑธ์
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก C์ธ์ด๋ก ์น ์๋ฒ๋ฅผ ๊ตฌํํด๋ณผ ๊ฑฐ์์. ์ฐ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ๋ชฉํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํํ์ ์น ์๋ฒ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋๋ค. ์ด ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ด๊ณ , ๊ฐ๋จํ "Hello, World!" ๋ฉ์์ง๋ฅผ ์๋ต์ผ๋ก ๋ณด๋ด์ค ๊ฑฐ์์.
๋จผ์ , ํ์ํ ํค๋ ํ์ผ๋ค์ ํฌํจ์์ผ ๋ณผ๊น์?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
์ด ํค๋ ํ์ผ๋ค์ ์ฐ๋ฆฌ๊ฐ ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ํ์ํ ๋ค์ํ ํจ์์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ๊ณตํด์ค์. ๋ง์น ์๋ฆฌ๋ฅผ ์์ํ๊ธฐ ์ ์ ํ์ํ ์ฌ๋ฃ๋ค์ ์ค๋นํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐ณ
๋ค์์ผ๋ก, ์ฐ๋ฆฌ์ ์๋ฒ๊ฐ ์ฌ์ฉํ ํฌํธ ๋ฒํธ๋ฅผ ์ ์ํด๋ณผ๊ฒ์.
#define PORT 8080
ํฌํธ ๋ฒํธ 8080์ ์ ํํ ์ด์ ๊ฐ ๊ถ๊ธํ์ ๊ฐ์? ์ด ํฌํธ๋ ์น ๊ฐ๋ฐ์์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฒํธ ์ค ํ๋์์. ๋ฌผ๋ก , ๋ค๋ฅธ ๋ฒํธ๋ฅผ ์ฌ์ฉํด๋ ๋ฉ๋๋ค. ๋จ, 1024 ๋ฏธ๋ง์ ํฌํธ ๋ฒํธ๋ ์์คํ ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ ์ฃผ์ํด์ผ ํด์!
๐ก ํ: ํฌํธ ๋ฒํธ๋ 0๋ถํฐ 65535๊น์ง ์ฌ์ฉํ ์ ์์ด์. ํ์ง๋ง 0-1023์ ์ ์๋ ค์ง ์๋น์ค๋ค์ด ์ฌ์ฉํ๋ฏ๋ก, ๊ฐ์ธ ํ๋ก์ ํธ์์๋ 1024 ์ด์์ ๋ฒํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์์.
์ด์ ์ฐ๋ฆฌ์ main ํจ์๋ฅผ ์์ฑํด๋ณผ๊น์? ์ฌ๊ธฐ์ ์๋ฒ์ ์ ์ฒด์ ์ธ ํ๋ฆ์ ์ ์ดํ ๊ฑฐ์์.
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char *hello = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello, World!";
// ์ฌ๊ธฐ์ ์๋ฒ ๋ก์ง์ ๊ตฌํํ ๊ฑฐ์์!
return 0;
}
์ฐ์! ๋ฒ์จ ์ฐ๋ฆฌ์ ์น ์๋ฒ์ ๋ผ๋๊ฐ ๋ง๋ค์ด์ก์ด์. ์ด์ ์ด ๋ผ๋์ ์ด์ ๋ถ์ฌ๋๊ฐ๋ฉด์, ์ง์ง ๋์ํ๋ ์น ์๋ฒ๋ก ๋ง๋ค์ด๋ณผ ๊ฑฐ์์. ๐
๋ค์ ์น์ ์์๋ ์๋ฒ ์์ผ์ ์์ฑํ๊ณ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋จ๊ณ๋ณ๋ก ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๋ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ๋ ์ฐจ๊ทผ์ฐจ๊ทผ ์๋ฒ ๊ตฌํ์ ๊ฐ ๋จ๊ณ๋ฅผ ๋ฐ์๋๊ฐ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ณผ๊น์? ๐
๐ ์๋ฒ ์์ผ ์์ฑ ๋ฐ ์ค์ ํ๊ธฐ
์, ์ด์ ์ฐ๋ฆฌ์ ์น ์๋ฒ๊ฐ ์ค์ ๋ก ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ผ ์ ์๋๋ก ์๋ฒ ์์ผ์ ์์ฑํ๊ณ ์ค์ ํด๋ณผ ๊ฑฐ์์. ์ด ๊ณผ์ ์ ๋ง์น ๊ฐ๊ฒ๋ฅผ ์ด๊ธฐ ์ํด ๋ฌธ์ ์ด๊ณ ์๋์ ๋ง์ดํ ์ค๋น๋ฅผ ํ๋ ๊ฒ๊ณผ ๋น์ทํด์! ๐ช
๋จผ์ , ์๋ฒ ์์ผ์ ์์ฑํด๋ณผ๊น์?
// ์๋ฒ ์์ผ ์์ฑ
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("์์ผ ์์ฑ ์คํจ");
exit(EXIT_FAILURE);
}
์ฌ๊ธฐ์ socket() ํจ์๋ ์๋ก์ด ์์ผ์ ์์ฑํด์. AF_INET์ IPv4๋ฅผ ์ฌ์ฉํ๋ค๋ ์๋ฏธ์ด๊ณ , SOCK_STREAM์ TCP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ค๋ ๋ป์ด์์. ๋ง์ง๋ง 0์ ํ๋กํ ์ฝ์ ์๋์ผ๋ก ์ ํํ๋ผ๋ ์๋ฏธ์์.
๐ ์์๋์ธ์: ์์ผ์ ๋คํธ์ํฌ ํต์ ์ ๋์ (endpoint)์ด์์. ๋ง์น ์ ํ๊ธฐ์ ๊ฐ์ฃ . ์ ํ๊ธฐ๊ฐ ์์ด์ผ ํตํํ ์ ์๋ฏ์ด, ์์ผ์ด ์์ด์ผ ๋คํธ์ํฌ ํต์ ์ ํ ์ ์์ด์!
๋ค์์ผ๋ก, ์๋ฒ ์์ผ์ ์ต์ ์ ์ค์ ํด๋ณผ๊ฒ์.
// ์์ผ ์ต์
์ค์
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt ์คํจ");
exit(EXIT_FAILURE);
}
์ด ์ฝ๋๋ ์์ผ์ ์ต์ ์ ์ค์ ํ๋ ๋ถ๋ถ์ด์์. SO_REUSEADDR์ SO_REUSEPORT ์ต์ ์ ์ค์ ํจ์ผ๋ก์จ, ์๋ฒ๋ฅผ ์ฌ์์ํ ๋ "์ฃผ์๊ฐ ์ด๋ฏธ ์ฌ์ฉ ์ค"์ด๋ผ๋ ์๋ฌ๋ฅผ ๋ฐฉ์งํ ์ ์์ด์. ๋ง์น ๊ฐ๊ฒ ๋ฌธ์ ์ด ๋ "์์ ์ค" ๊ฐํ์ ๊ฑธ์ด๋๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ ! ๐ช
์ด์ ์๋ฒ ์ฃผ์๋ฅผ ์ค์ ํด๋ณผ๊น์?
// ์๋ฒ ์ฃผ์ ์ค์
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์๋ฒ๊ฐ ์ฌ์ฉํ ์ฃผ์๋ฅผ ์ค์ ํ๊ณ ์์ด์. INADDR_ANY๋ ์๋ฒ์ ๋ชจ๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์์ ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ธ๋ค๋ ์๋ฏธ์์. ๊ทธ๋ฆฌ๊ณ htons() ํจ์๋ ํธ์คํธ ๋ฐ์ดํธ ์์๋ฅผ ๋คํธ์ํฌ ๋ฐ์ดํธ ์์๋ก ๋ณํํด์ฃผ๋ ์ญํ ์ ํด์.
๋ง์ง๋ง์ผ๋ก, ์์ผ์ ํน์ ์ฃผ์์ ํฌํธ์ ๋ฐ์ธ๋ฉํ๊ณ , ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ์ํ๋ก ๋ง๋ค์ด๋ณผ๊ฒ์.
// ์์ผ๊ณผ ์ฃผ์๋ฅผ ๋ฐ์ธ๋ฉ
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind ์คํจ");
exit(EXIT_FAILURE);
}
// ์ฐ๊ฒฐ ๋๊ธฐ ์ํ๋ก ์ง์
if (listen(server_fd, 3) < 0) {
perror("listen ์คํจ");
exit(EXIT_FAILURE);
}
bind() ํจ์๋ ์์ผ์ ํน์ ์ฃผ์์ ํฌํธ์ ์ฐ๊ฒฐํด์. ๊ทธ๋ฆฌ๊ณ listen() ํจ์๋ ์๋ฒ ์์ผ์ ์ฐ๊ฒฐ ๋๊ธฐ ์ํ๋ก ๋ง๋ค์ด์ค์. ์ฌ๊ธฐ์ 3์ ๋๊ธฐ์ด์ ์ต๋ ๊ธธ์ด๋ฅผ ์๋ฏธํด์. ๋ง์น ๊ฐ๊ฒ ์์ 3๋ช ๊น์ง ์ค์ ์ค ์ ์๊ฒ ํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ ! ๐ฅ๐ฅ๐ฅ
๐ก ํ: ์ค์ ์๋ฒ์์๋ ๋๊ธฐ์ด์ ๊ธธ์ด๋ฅผ ๋ ํฌ๊ฒ ์ค์ ํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด์์. ์ด๋ฅผ ํตํด ๋ ๋ง์ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ฃ !
์์ฐ! ์ด์ ์ฐ๋ฆฌ์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ผ ์ค๋น๊ฐ ์๋ฃ๋์์ด์. ๋ง์น ์ฌ๋ฅ๋ท์์ ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ ์ค์ ๋ก ์ ์ฉํด๋ณธ ๊ฒ์ฒ๋ผ, ์ฐ๋ฆฌ๋ ์๋ฒ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ด๋ฅผ ์ฐจ๊ทผ์ฐจ๊ทผ ์ตํ๊ฐ๊ณ ์์ด์. ๐
๋ค์ ์น์ ์์๋ ์ค์ ๋ก ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ด๊ณ , ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ๊ณ์ํด์ ์ฐ๋ฆฌ์ ์น ์๋ฒ ๊ตฌํ ์ฌ์ ์ ์ด์ด๋๊ฐ๋ณผ๊น์? ๐
๐ค ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์๋ฝ ๋ฐ ์์ฒญ ์ฒ๋ฆฌํ๊ธฐ
์, ์ด์ ์ฐ๋ฆฌ์ ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ ์์ด์. ๊ทธ๋ผ ์ด์ ์ค์ ๋ก ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ์๋ฝํ๊ณ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ๊น์? ์ด ๊ณผ์ ์ ๋ง์น ์๋์ด ๊ฐ๊ฒ์ ๋ค์ด์์ ์ฃผ๋ฌธ์ ํ๊ณ , ์ฐ๋ฆฌ๊ฐ ๊ทธ ์ฃผ๋ฌธ์ ์ฒ๋ฆฌํ๋ ๊ฒ๊ณผ ๋น์ทํด์! ๐ฝ๏ธ
๋จผ์ , ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ์๋ฝํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊ฒ์.
while(1) {
printf("์๋ก์ด ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ์ค...\n");
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept ์คํจ");
exit(EXIT_FAILURE);
}
// ์ฌ๊ธฐ์ ํด๋ผ์ด์ธํธ ์์ฒญ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ๋ค์ด๊ฐ ๊ฑฐ์์!
}
์ฌ๊ธฐ์ accept() ํจ์๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์์ฒญ์ ์๋ฝํด์. ์ด ํจ์๋ ์๋ก์ด ์์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋๋ฐ, ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ํต์ ํ ์ ์์ด์. while(1) ๋ฃจํ๋ฅผ ์ฌ์ฉํด์ ์๋ฒ๊ฐ ๊ณ์ํด์ ์๋ก์ด ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ผ ์ ์๋๋ก ํ์ด์. ๋ง์น ๊ฐ๊ฒ์์ ๊ณ์ํด์ ์๋ก์ด ์๋์ ๋ง์ดํ๋ ๊ฒ๊ณผ ๊ฐ์ฃ ! ๐
๐ ์์๋์ธ์: accept() ํจ์๋ ์๋ก์ด ์ฐ๊ฒฐ์ด ๋ค์ด์ฌ ๋๊น์ง ๋ธ๋กํน(๋๊ธฐ)๋ฉ๋๋ค. ์ฆ, ์ฐ๊ฒฐ์ด ๋ค์ด์ค๊ธฐ ์ ๊น์ง๋ ๋ค์ ์ฝ๋๋ก ๋์ด๊ฐ์ง ์์์!
์ด์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฝ๊ณ ์ฒ๋ฆฌํ๋ ์ฝ๋๋ฅผ ์์ฑํด๋ณผ๊น์?
char buffer[1024] = {0};
read(new_socket, buffer, 1024);
printf("ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ๋ฉ์์ง: %s\n", buffer);
char *response = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello, World!";
write(new_socket, response, strlen(response));
printf("Hello ๋ฉ์์ง๋ฅผ ๋ณด๋์ต๋๋ค\n");
close(new_socket);
์ด ์ฝ๋์์๋ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ค์ด ์ผ์ด๋๊ณ ์์ด์:
- read() ํจ์๋ฅผ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฝ์ด๋ค์ ๋๋ค.
- ๋ฐ์ ๋ฉ์์ง๋ฅผ ์ฝ์์ ์ถ๋ ฅํฉ๋๋ค. (์ค์ ์๋ฒ์์๋ ์ด ๋ถ๋ถ์์ ์์ฒญ์ ๋ถ์ํ๊ณ ์ ์ ํ ์๋ต์ ์์ฑํด์.)
- write() ํจ์๋ฅผ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ์๊ฒ "Hello, World!" ๋ฉ์์ง๋ฅผ ๋ณด๋ ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก, close() ํจ์๋ก ์ฐ๊ฒฐ์ ์ข ๋ฃํฉ๋๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ๋ณด๋ด๋ ์๋ต์ HTTP ํ๋กํ ์ฝ์ ๋ฐ๋ฅด๊ณ ์์ด์. "HTTP/1.1 200 OK"๋ ์ํ ๋ผ์ธ์ด๊ณ , "Content-Type: text/plain"์ ํค๋, ๊ทธ๋ฆฌ๊ณ ๋น ์ค ๋ค์์ "Hello, World!"๊ฐ ์ค์ ์ปจํ ์ธ (๋ฐ๋)์์.
๐ก ํ: ์ค์ ์น ์๋ฒ์์๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์์ธํ ๋ถ์ํ๊ณ , ์์ฒญ๋ ๋ฆฌ์์ค(์: HTML ํ์ผ)๋ฅผ ์ฐพ์ ์๋ต์ผ๋ก ๋ณด๋ด์ค์. ์ฐ๋ฆฌ์ ์์ ๋ ๋จ์ํ๋ฅผ ์ํด ํญ์ ๊ฐ์ ์๋ต์ ๋ณด๋ด๊ณ ์์ด์.
์! ์ด์ ์ฐ๋ฆฌ์ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ฐ์๋ค์ด๊ณ , ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋์์ด์. ์ด๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ ์ค์ ๋ก ์ ์ฉํด๋ณด๋ ๊ฒ๊ณผ ๊ฐ์์. ์ฐ๋ฆฌ๋ ์ด์ ์๋ฒ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ ์ธ ํ๋ฆ์ ์ดํดํ๊ณ ๊ตฌํํ ์ ์๊ฒ ๋์์ฃ ! ๐
๋ค์ ์น์ ์์๋ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์๋ฒ๋ฅผ ์คํํ๊ณ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ ๊ฑฐ์์. ์ค์ ๋ก ๋์ํ๋ ์ฐ๋ฆฌ๋ง์ ์น ์๋ฒ๋ฅผ ๋ณผ ์๊ฐ์ ๋ฒ์จ ์ค๋ ์ง ์๋์? ๊ณ์ํด์ ์ฐ๋ฆฌ์ ์น ์๋ฒ ๊ตฌํ ์ฌ์ ์ ์ด์ด๋๊ฐ๋ณผ๊น์? ๐
๐ ์๋ฒ ์คํ ๋ฐ ํ ์คํธํ๊ธฐ
๋๋์ด ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์น ์๋ฒ๋ฅผ ์คํํ๊ณ ํ ์คํธํ ์๊ฐ์ด ์์ด์! ์ด ๊ณผ์ ์ ๋ง์น ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ง๋ ์๋ฆฌ๋ฅผ ๋ง๋ณด๋ ๊ฒ๊ณผ ๊ฐ์์. ์ ๋ง ํฅ๋ฏธ์ง์งํ์ง ์๋์? ๐
๋จผ์ , ์ฐ๋ฆฌ์ ์ ์ฒด ์ฝ๋๋ฅผ ํ ๋ฒ ์ดํด๋ณผ๊น์?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 8080
int main() {
int server_fd, new_socket;
struct sockaddr_in address;
int addrlen = sizeof(address);
char *hello = "HTTP/1.1 200 OK\nContent-Type: text/plain\n\nHello, World!";
// ์๋ฒ ์์ผ ์์ฑ
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("์์ผ ์์ฑ ์คํจ");
exit(EXIT_FAILURE);
}
// ์์ผ ์ต์
์ค์
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt ์คํจ");
exit(EXIT_FAILURE);
}
// ์๋ฒ ์ฃผ์ ์ค์
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// ์์ผ๊ณผ ์ฃผ์๋ฅผ ๋ฐ์ธ๋ฉ
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind ์คํจ");
exit(EXIT_FAILURE);
}
// ์ฐ๊ฒฐ ๋๊ธฐ ์ํ๋ก ์ง์
if (listen(server_fd, 3) < 0) {
perror("listen ์คํจ");
exit(EXIT_FAILURE);
}
while(1) {
printf("์๋ก์ด ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ์ค...\n");
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {
perror("accept ์คํจ");
exit(EXIT_FAILURE);
}
char buffer[1024] = {0};
read(new_socket, buffer, 1024);
printf("ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ๋ฉ์์ง: %s\n", buffer);
write(new_socket, hello, strlen(hello));
printf("Hello ๋ฉ์์ง๋ฅผ ๋ณด๋์ต๋๋ค\n");
close(new_socket);
}
return 0;
}
์ด์ ์ด ์ฝ๋๋ฅผ ์ปดํ์ผํ๊ณ ์คํํด๋ณผ๊น์? ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด์ธ์:
gcc -o webserver webserver.c
./webserver
๋ง์ฝ ๋ชจ๋ ๊ฒ์ด ์ ๋์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ฉ์์ง๊ฐ ๋ณด์ผ ๊ฑฐ์์:
์๋ก์ด ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ์ค...
์ถํํฉ๋๋ค! ๐ ์ฌ๋ฌ๋ถ์ ์น ์๋ฒ๊ฐ ์ง๊ธ ์คํ ์ค์ด์์. ์ด์ ์ด ์๋ฒ๋ฅผ ํ ์คํธํด๋ณผ ์ฐจ๋ก์์.
๐ ์์๋์ธ์: ์ค์ ์๋ฒ ํ๊ฒฝ์์๋ ๋ณด์, ์ฑ๋ฅ, ์์ ์ฑ ๋ฑ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ๋ง์์. ์ฐ๋ฆฌ์ ์์ ๋ ํ์ต์ ์ํ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ์ด์์.
์๋ฒ๋ฅผ ํ ์คํธํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ด์. ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์์. ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํด๋ณด์ธ์:
http://localhost:8080
์์ฐ! "Hello, World!" ๋ฉ์์ง๊ฐ ๋ณด์ด๋์? ๐
๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ curl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฑฐ์์. ์๋ก์ด ํฐ๋ฏธ๋ ์ฐฝ์ ์ด๊ณ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํด๋ณด์ธ์:
curl http://localhost:8080
์ด ๋ช ๋ น์ด๋ "Hello, World!" ๋ฉ์์ง๋ฅผ ๋ฐํํ ๊ฑฐ์์.
์๋ฒ ํฐ๋ฏธ๋๋ก ๋์๊ฐ๋ณด๋ฉด, ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ๊ณผ ์์ฒญ์ ์ฒ๋ฆฌํ ๋ก๊ทธ๋ฅผ ๋ณผ ์ ์์ ๊ฑฐ์์:
์๋ก์ด ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ์ค...
ํด๋ผ์ด์ธ ํธ๋ก๋ถํฐ ๋ฐ์ ๋ฉ์์ง: GET / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.68.0
Accept: */*
Hello ๋ฉ์์ง๋ฅผ ๋ณด๋์ต๋๋ค
์๋ก์ด ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋ ์ค...
์! ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์น ์๋ฒ๊ฐ ์ค์ ๋ก ๋์ํ๊ณ ์์ด์. ์ ๋ง ๋๋จํ์ง ์๋์? ๐
๐ก ํ: ์๋ฒ๋ฅผ ์ข ๋ฃํ๋ ค๋ฉด ํฐ๋ฏธ๋์์ Ctrl+C๋ฅผ ๋๋ฅด์ธ์. ๊ทธ๋ฆฌ๊ณ ๋ค์ ์์ํ๊ณ ์ถ๋ค๋ฉด ./webserver ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๋ผ์!
์ด์ ์ฌ๋ฌ๋ถ์ C์ธ์ด๋ก ๊ฐ๋จํ ์น ์๋ฒ๋ฅผ ๊ตฌํํ๊ณ ์คํํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ด์. ์ด๋ ๋ง์น ์ฌ๋ฅ๋ท์์ ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ ์ค์ ๋ก ์ ์ฉํด๋ณธ ๊ฒ๊ณผ ๊ฐ์์. ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ์ด๋ฅผ ์ง์ ๊ฒฝํํด๋ณด์ จ์ฃ ! ๐
๋ฌผ๋ก , ์ด ์๋ฒ๋ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ๋ง์ ๊ฐ์ง๊ณ ์์ด์. ์ค์ ์น ์๋ฒ๋ ๋ ๋ง์ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์์ฃ . ์๋ฅผ ๋ค๋ฉด:
- ๋ค์ํ HTTP ๋ฉ์๋ (GET, POST, PUT, DELETE ๋ฑ) ์ฒ๋ฆฌ
- ์ ์ ํ์ผ ์๋น (HTML, CSS, JavaScript, ์ด๋ฏธ์ง ๋ฑ)
- ๋์ ์ฝํ ์ธ ์์ฑ
- ๋ณด์ ๊ธฐ๋ฅ (HTTPS, ์ธ์ฆ ๋ฑ)
- ๋์์ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ์ฒ๋ฆฌ (๋ฉํฐ์ค๋ ๋ฉ ๋๋ ๋น๋๊ธฐ I/O)
์ด๋ฐ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํ๋ฉด์ ์ฌ๋ฌ๋ถ์ ์น ์๋ฒ๋ฅผ ์ ์ ๋ฐ์ ์์ผ ๋๊ฐ ์ ์์ด์. ๋ง์น ์ฌ๋ฅ๋ท์์ ๊ณ์ํด์ ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๊ณ ๋ฐ์ ์์ผ ๋๊ฐ๋ ๊ฒ์ฒ๋ผ ๋ง์ด์ฃ ! ๐
์ฌ๋ฌ๋ถ์ ์ฒซ ์น ์๋ฒ ๊ตฌํ์ ๋ค์ ํ ๋ฒ ์ถํ๋๋ ค์! ๐ ์ด์ ์ฌ๋ฌ๋ถ์ ์น์ ๊ธฐ๋ณธ ๋์ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ , ์ง์ ๊ตฌํ๊น์ง ํด๋ณด์ จ์ด์. ์ด ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๋ ๋ณต์กํ๊ณ ๊ฐ๋ ฅํ ์๋ฒ๋ฅผ ๋ง๋ค์ด ๋๊ฐ ์ ์์ ๊ฑฐ์์.
๋ค์ ๋จ๊ณ๋ก๋ ์ด๋ค ๊ฒ์ ํด๋ณผ ์ ์์๊น์? ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ ์ํด ๋๋ฆด๊ฒ์:
- ์๋ฒ๊ฐ ์ค์ HTML ํ์ผ์ ์๋นํ๋๋ก ๊ฐ์ ํด๋ณด๊ธฐ
- POST ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ ์ถ๊ฐํ๊ธฐ
- ์ฌ๋ฌ ํด๋ผ์ด์ธํธ๋ฅผ ๋์์ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ฉํฐ์ค๋ ๋ฉ ๊ตฌํํ๊ธฐ
- ๊ฐ๋จํ ๋ก๊น ์์คํ ์ถ๊ฐํ๊ธฐ
- ๊ธฐ๋ณธ์ ์ธ ๋ณด์ ๊ธฐ๋ฅ ๊ตฌํํด๋ณด๊ธฐ
์ด ๋ชจ๋ ๊ณผ์ ์ด ๋๋ก๋ ์ด๋ ต๊ณ ๋์ ์ ์ผ๋ก ๋๊ปด์ง ์ ์์ด์. ํ์ง๋ง ์ฌ๋ฅ๋ท์์ ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ฐ๋ ๊ฒ์ฒ๋ผ, ํ ๋จ๊ณ์ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋์๊ฐ๋ค ๋ณด๋ฉด ์ด๋์ ํ๋ฅญํ ์น ์๋ฒ ๊ฐ๋ฐ์๊ฐ ๋์ด ์์ ๊ฑฐ์์! ๐ช
์ฌ๋ฌ๋ถ์ ์น ์๋ฒ ๊ฐ๋ฐ ์ฌ์ ์ ์์ํฉ๋๋ค. ๊ณ์ํด์ ํธ๊ธฐ์ฌ์ ๊ฐ์ง๊ณ ํ์ตํ๊ณ ์คํํด๋ณด์ธ์. ๊ทธ๋ฆฌ๊ณ ์ธ์ ๋ ์ง๋ฌธ์ด ์๋ค๋ฉด, ์ฃผ์ ํ์ง ๋ง๊ณ ๋ฌผ์ด๋ณด์ธ์. ํจ๊ป ์ฑ์ฅํด ๋๊ฐ๋ ๊ฒ, ๊ทธ๊ฒ์ด ๋ฐ๋ก ํ๋ก๊ทธ๋๋ฐ์ ๋ฌ๋ฏธ๋๊น์! ๐ฑ
ํ์ด์ ๋น๋๋ค, ๊ทธ๋ฆฌ๊ณ ์ฆ๊ฑฐ์ด ์ฝ๋ฉ ๋์ธ์! ๐๐จโ๐ป๐ฉโ๐ป
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ