
์ ๋ฒ์ ๋ง๋ ์๋ฒ์ ๋ฌธ์ ์
http ์๋ฒ์ธ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์ ์์ ํ ์ ์์๋ค.ย
ํค๋๋ฅผ ์ ์กํ๋ ์ฝ๋๊ฐ ์์ด์ ์ ์์ด ์๋๋ค.ย
์ด๋ฒ์๋ ๋ธ๋ผ์ฐ์ ์์ ์ ์ํ ์ ์๋๋ก ํค๋๋ฅผ ์ถ๊ฐํ๊ณ ,
๋ค์ํ ํ์ผ์ ์ ์ ํ ์ ์๊ฒ ํ๊ธฐ ์ํด์ย
receive ๋ฌธ์์ด์ ๋์ ์ผ๋ก ์ฒ๋ฆฌํด์ ๋ค์ํ ํ์ด์ง๋ฅผ
๋ณผ ์ ์๋๋ก ๋ง๋ค ๊ฒ์ด๋ค
์ฝ๋
#include <sys/socket.h> // ์์ผ ํ๋ก๊ทธ๋๋ฐ์ ํ์ํ ๊ธฐ๋ณธ ํค๋
#include <string.h> // ๋ฌธ์์ด ์ฒ๋ฆฌ ํจ์๋ฅผ ์ํ ํค๋
#include <stdio.h> // ํ์ค ์
์ถ๋ ฅ ํจ์๋ฅผ ์ํ ํค๋
#include <fcntl.h> // ํ์ผ ์ ์ด๋ฅผ ์ํ ํค๋
#include <sys/sendfile.h> // sendfile() ํจ์๋ฅผ ์ํ ํค๋
#include <unistd.h> // UNIX ํ์ค ํจ์๋ฅผ ์ํ ํค๋
#include <netinet/in.h> // ์ธํฐ๋ท ํ๋กํ ์ฝ ํจ์๋ฅผ ์ํ ํค๋
#include <time.h> // ์๊ฐ ๊ด๋ จ ํจ์๋ฅผ ์ํ ํค๋
#include <sys/stat.h> // ํ์ผ ์ํ ์ ๋ณด๋ฅผ ์ํ ํค๋
int main() {
int server_fd = socket(AF_INET, SOCK_STREAM, 0); // TCP ์์ผ ์์ฑ
int opt = 1; // ์์ผ ์ต์
๊ฐ ์ค์
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); // ์์ผ ์ฃผ์ ์ฌ์ฌ์ฉ ์ต์
์ค์
struct sockaddr_in addr = { // ์๋ฒ ์ฃผ์ ๊ตฌ์กฐ์ฒด ์ด๊ธฐํ
.sin_family = AF_INET, // IPv4 ์ฃผ์ ์ฒด๊ณ ์ฌ์ฉ
.sin_port = htons(8080), // ํฌํธ 8080 ์ค์ (ํธ์คํธ ๋ฐ์ดํธ ์์๋ฅผ ๋คํธ์ํฌ ๋ฐ์ดํธ ์์๋ก ๋ณํ)
.sin_addr.s_addr = INADDR_ANY // ๋ชจ๋ ๋คํธ์ํฌ ์ธํฐํ์ด์ค์์ ์ฐ๊ฒฐ ์๋ฝ
};
if (bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { // ์์ผ์ ์ฃผ์ ๋ฐ์ธ๋ฉ
perror("bind failed"); // ๋ฐ์ธ๋ฉ ์คํจ์ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ
return 1; // ํ๋ก๊ทธ๋จ ์ข
๋ฃ
}
if (listen(server_fd, 10) < 0) { // ์ฐ๊ฒฐ ๋๊ธฐ์ด 10๊ฐ๋ก ์ค์ ํ์ฌ ๋ฆฌ์ค๋ ์์
perror("listen failed"); // ๋ฆฌ์ค๋ ์คํจ์ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ
return 1; // ํ๋ก๊ทธ๋จ ์ข
๋ฃ
}
printf("Server listening on port 8080...\n"); // ์๋ฒ ์์ ๋ฉ์์ง ์ถ๋ ฅ
while (1) { // ๋ฌดํ ๋ฃจํ๋ก ํด๋ผ์ด์ธํธ ์์ฒญ ๊ณ์ ์ฒ๋ฆฌ
int client_fd = accept(server_fd, NULL, NULL); // ํด๋ผ์ด์ธํธ ์ฐ๊ฒฐ ์๋ฝ
if (client_fd < 0) { // ์ฐ๊ฒฐ ์๋ฝ ์คํจ ์ฒดํฌ
perror("accept failed"); // ์คํจ์ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ
continue; // ๋ค์ ์ฐ๊ฒฐ ์๋
}
char buffer[4096] = {0}; // ์์ฒญ์ ์ ์ฅํ ๋ฒํผ ์ด๊ธฐํ
ssize_t bytes_read = recv(client_fd, buffer, sizeof(buffer) - 1, 0); // ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ดํฐ ์์
if (bytes_read <= 0) { // ๋ฐ์ดํฐ ์์ ์คํจ ์ฒดํฌ
close(client_fd); // ํด๋ผ์ด์ธํธ ์์ผ ๋ซ๊ธฐ
continue; // ๋ค์ ์ฐ๊ฒฐ ์ฒ๋ฆฌ
}
char file_path[256] = {0}; // ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ ๋ฒํผ ์ด๊ธฐํ
if (sscanf(buffer, "GET /%255s", file_path) != 1) { // HTTP GET ์์ฒญ์์ ํ์ผ ๊ฒฝ๋ก ์ถ์ถ
char *response = "HTTP/1.1 400 Bad Request\r\nContent-Type: text/plain\r\n\r\nInvalid Request"; // ์๋ชป๋ ์์ฒญ ์๋ต ๋ฉ์์ง
send(client_fd, response, strlen(response), 0); // ์๋ฌ ์๋ต ์ ์ก
close(client_fd); // ํด๋ผ์ด์ธํธ ์์ผ ๋ซ๊ธฐ
continue; // ๋ค์ ์ฐ๊ฒฐ ์ฒ๋ฆฌ
}
char *space_pos = strchr(file_path, ' '); // ํ์ผ ๊ฒฝ๋ก์์ ๊ณต๋ฐฑ ๋ฌธ์ ์ฐพ๊ธฐ
if (space_pos) *space_pos = '\0'; // ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ NULL๋ก ๋ณ๊ฒฝํ์ฌ ๋ฌธ์์ด ์ข
๋ฃ
printf("Requesting file: %s\n", file_path); // ์์ฒญ๋ ํ์ผ ๊ฒฝ๋ก ์ถ๋ ฅ
int file_fd = open(file_path, O_RDONLY); // ์์ฒญ๋ ํ์ผ ์ด๊ธฐ
if (file_fd < 0) { // ํ์ผ ์ด๊ธฐ ์คํจ ์ฒดํฌ
printf("Failed to open file: %s\n", file_path); // ์คํจ ๋ฉ์์ง ์ถ๋ ฅ
char *response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\n\r\n404 File Not Found"; // 404 ์๋ฌ ์๋ต
send(client_fd, response, strlen(response), 0); // ์๋ฌ ์๋ต ์ ์ก
} else {
struct stat file_stat; // ํ์ผ ์ ๋ณด๋ฅผ ์ ์ฅํ ๊ตฌ์กฐ์ฒด
if (fstat(file_fd, &file_stat) < 0) { // ํ์ผ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
close(file_fd); // ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ซ๊ธฐ
close(client_fd); // ํด๋ผ์ด์ธํธ ์์ผ ๋ซ๊ธฐ
continue; // ๋ค์ ์ฐ๊ฒฐ ์ฒ๋ฆฌ
}
char header[512]; // HTTP ํค๋๋ฅผ ์ ์ฅํ ๋ฒํผ
sprintf(header, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: %ld\r\n\r\n", file_stat.st_size); // HTTP ์ฑ๊ณต ์๋ต ํค๋ ์์ฑ
send(client_fd, header, strlen(header), 0); // HTTP ํค๋ ์ ์ก
off_t offset = 0; // ํ์ผ ์คํ์
ssize_t sent = sendfile(client_fd, file_fd, &offset, file_stat.st_size); // ํ์ผ ๋ฐ์ดํฐ ์ ์ก
if (sent < 0) { // ํ์ผ ์ ์ก ์คํจ ์ฒดํฌ
perror("sendfile failed"); // ์คํจ์ ์๋ฌ ๋ฉ์์ง ์ถ๋ ฅ
}
close(file_fd); // ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ซ๊ธฐ
}
close(client_fd); // ํด๋ผ์ด์ธํธ ์์ผ ๋ซ๊ธฐ
}
close(server_fd); // ์๋ฒ ์์ผ ๋ซ๊ธฐ
return 0; // ํ๋ก๊ทธ๋จ ์ข
๋ฃ
}
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ๊ตฌ์ฑํ์๋ค.ย
๋ฌด์จ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์๊น?
-
ํค๋ ์ฝ์
-
๋์ ์ธ receive ์ฒ๋ฆฌ
-
์์ธ ์ฒ๋ฆฌ
-
๋ฌดํ ๋ฃจํ ์ถ๊ฐ
์ด๋ ๊ฒ ํ๋๊น ์น์๋ฒ๋ฅผ ๊ตฌ์ถํ ์ ์์๋ค.ย
GPT๊ฐ ์์ง๊น์ง๋ ๋ด ์ฝ๋๋ฅผ ์ดํดํด์ ์ด๋ ต์ง ์๊ฒ ๋ง๋ค ์ ์์๋ค
๋ค์์ ์๋ฒ ๋ฐฐํฌ๋ฅผ ํด์ ๋ค๋ฅธ ์ปดํจํฐ์์๋ ์ด ์๋ฒ๋ฅผ ์ ์ ํ ์ ์๋๋ก ๋ง๋ค์ด ๋ณผ ๊ฒ์ด๋ค.
๋ฌธ์ ์
๋ช ์์ด ์น์๋ฒ์ธ๋ฐ ๋ด๋ถ์์๋ง ์๋ํด์ ์น๊ตฌ๋ค์๊ฒ ๊ณต์ ํด์ค ์ ์๋ค.
๊ทธ๋์ ์ธ๋ถ์์๋ ๋์ ์๋ฒ๋ฅผ ๋ฐฉ๋ฌธํ ์ ์๋๋ก ํฌํธ ๋ฐฉํ๋ฒฝ ์ค์ ์ ํด๋ณด์
์ค์
๋ฐฉํ๋ฒฝ ์ค์ ์ ํ์ธํ๊ณ ํฌํธ 8080์ ํ์ฉํด๋ณด์
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
sudo ufw allow 8080/tcp
์ ์ํด๋ณด์

๊ตณ๊ตณ ์๋ค์ด๊ฐ์ง๋ค
๋๋ค๋ฅธ ๋ฌธ์ ์
์ง๊ธ ์ด ์๋ฒ๋ฅผ ํ๊ต WIFI๋ก ๊ตฌ๋ํ๊ณ ์๋๋ฐ, ํ๊ต ์์ดํ์ด์์๋ ํฌํธํฌ์๋ฉ์ด ๋์ง ์๋๋ค!!
๊ทธ๋์ ๋งค๋ฒ ์ ๋คํํ ๋ค๋ฅธ ์ฃผ์๋ฅผ ์ ์กํด์ผํ๋ค ใ ใ