Sockets là xương sống của mọi thứ, từ web server đến các trò chơi đa người chơi.
Lớp | Mô tả |
---|---|
Physical Layer | Cáp và đường truyền vật lý |
Data Link Layer | Địa chỉ MAC và bảng chuyển mạch Ethernet |
Network Layer | Địa chỉ IP, nơi gửi đến |
Transport Layer | Giao thức truyền tải như TCP hoặc UDP |
Session Layer | Quản lý phiên kết nối |
Presentation Layer | Chuyển đổi dữ liệu, mã hóa |
Application Layer | Phần mềm ứng dụng như trình duyệt hay server của bạn |
Mô hình OSI như một hệ thống bưu chính phức tạp, từ đường đi của thư tín đến cách bạn gửi bức thư đó.
C++ đem lại sự toàn quyền và sự am hiểu chuyên sâu, còn framework giúp phát triển nhanh và tiện lợi.
/
và “404 Not Found” với đường dẫn còn lại. Hãy bước vào!AF_INET
: địa chỉ IPv4SOCK_STREAM
: TCP (giao thức đảm bảo truyền dẫn tin cậy)struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(4221);
INADDR_ANY
)htons()
để chuyển đổi sang byte mạng (big-endian).bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));
listen(server_fd, 5);
int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len);
char buffer[1024] = {0};read(client_fd, buffer, sizeof(buffer)-1);std::string request(buffer);
// Phân tích đường dẫn (giản lược)std::string path = "/";if (request.find("GET / ") != std::string::npos) { path = "/";} else if (request.find("GET /") != std::string::npos) { size_t start = request.find("GET /") + 5; size_t end = request.find(" ", start); path = request.substr(start, end - start);}
// Gửi phản hồistd::string response;if (path == "/") { response = "HTTP/1.1 200 OK\r\n\r\n";} else { response = "HTTP/1.1 404 Not Found\r\n\r\n";}write(client_fd, response.c_str(), response.length());
close(client_fd);
#include <iostream>#include <string>#include <cstring>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>
int main() { // Tạo socket int server_fd = socket(AF_INET, SOCK_STREAM, 0); if (server_fd == -1) { std::cerr << "Socket creation failed\n"; return 1; }
// Cho phép tái sử dụng địa chỉ int opt = 1; setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
// Thiết lập địa chỉ server struct sockaddr_in server_addr; server_addr.sin_family = AF_INET; server_addr.sin_addr.s_addr = INADDR_ANY; server_addr.sin_port = htons(4221);
// Bind socket if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) { std::cerr << "Bind failed\n"; return 1; }
// Listen if (listen(server_fd, 5) < 0) { std::cerr << "Listen failed\n"; return 1; } std::cout << "Server listening on port 4221...\n";
while (true) { struct sockaddr_in client_addr; socklen_t client_addr_len = sizeof(client_addr); int client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len); if (client_fd < 0) { std::cerr << "Accept failed\n"; continue; }
char buffer[1024] = {0}; read(client_fd, buffer, sizeof(buffer) - 1); std::string request(buffer);
std::string path = "/"; if (request.find("GET / ") != std::string::npos) { path = "/"; } else if (request.find("GET /") != std::string::npos) { size_t start = request.find("GET /") + 5; size_t end = request.find(" ", start); path = request.substr(start, end - start); }
std::string response; if (path == "/") { response = "HTTP/1.1 200 OK\r\n\r\n"; } else { response = "HTTP/1.1 404 Not Found\r\n\r\n"; } write(client_fd, response.c_str(), response.length());
close(client_fd); }
close(server_fd); return 0;}
socket()
setsockopt()
bind()
listen()
accept()
read()
và write()
close()
Giống như một công thức nấu ăn hoàn hảo cho lập trình mạng.
SO_REUSEADDR
.htons
/ ntohs
để chuyển đổi.Sức mạnh của socket thật sự vô biên – > cho đến lúc bạn muốn order pizza qua mạng socket! 😉
server.cpp
.g++ server.cpp -o server./server
/about
trả về thông điệp riêng.<h1>Hello, World!</h1>
.Hãy bắt đầu chạy server, chỉnh sửa code, và chinh phục thế giới mạng!