इस ब्लॉग पोस्ट में, हम पता लगाएंगे कि सी में एक सरल टीसीपी सर्वर कैसे बनाया जाए जो HTML फ़ाइलों की सेवा कर सके। हम कोड का विश्लेषण करेंगे, बताएंगे कि यह कैसे काम करता है, और इस परियोजना को बढ़ाने के लिए भविष्य की योजनाओं पर चर्चा करेंगे। यह इस बात का उत्कृष्ट उदाहरण है कि आप प्रक्रिया को अधिक जटिल किए बिना सी में "सिर्फ काम कैसे कर सकते हैं"!
इस परियोजना का लक्ष्य एक बुनियादी टीसीपी सर्वर को कार्यान्वित करना है जो क्लाइंट कनेक्शन सुनता है और अनुरोध पर HTML फ़ाइलें प्रदान करता है। सर्वर क्लाइंट अनुरोधों को संभालेगा, निर्दिष्ट HTML फ़ाइल को पढ़ेगा, और HTTP प्रतिक्रिया के रूप में सामग्री को क्लाइंट को वापस भेजेगा।
अपने कोड को व्यवस्थित करने के लिए, हम प्रोजेक्ट की संरचना इस प्रकार करेंगे:
tcp_server_c/ ├── CMakeLists.txt # Build configuration ├── include/ │ ├── server.h # Main server header file │ ├── html_serve.h # Header for serve_html function │ ├── request_handler.h # Header for handle_client function │ └── socket_utils.h # Header for socket utility functions ├── src/ │ ├── server.c # Main server program │ ├── html_serve.c # serve_html function │ ├── request_handler.c # handle_client function │ └── socket_utils.c # Utility functions for socket operations └── README.md # Project documentation
सबसे पहले, सॉकेट आरंभीकरण को संभालने के लिए एक उपयोगिता फ़ाइल बनाएं। यह सुनिश्चित करेगा कि हमारा मुख्य सर्वर कोड साफ़ और केंद्रित रहे।
include/socket_utils.h
#ifndef SOCKET_UTILS_H #define SOCKET_UTILS_H #includeint initialize_server(struct sockaddr_in* address); #endif
src/socket_utils.c
#include "socket_utils.h" #include#include #include #include #define PORT 8080 int initialize_server(struct sockaddr_in* address) { int server_fd; int opt = 1; if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { perror("Socket failed!"); return -1; } if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)) != 0) { perror("setsockopt failed"); close(server_fd); return -1; } 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)) 2. HTML सर्विंग कार्यक्षमता
इसके बाद, हम HTML फ़ाइलों की सेवा के लिए एक फ़ंक्शन बनाएंगे। यह फ़ंक्शन HTML फ़ाइल की सामग्री को पढ़ेगा और उन्हें कॉलर को लौटा देगा।
include/html_server.h
#ifndef HTML_SERVER_H #define HTML_SERVER_H char* serve_html(const char* filename); #endifsrc/html_server.c
#include "html_server.h" #include#include #include char* serve_html(const char* filename) { FILE* file = fopen(filename, "r"); if (!file) { perror("Error opening file"); return NULL; } fseek(file, 0, SEEK_END); long length = ftell(file); fseek(file, 0, SEEK_SET); char* buffer = malloc(length 1); if (!buffer) { perror("Error allocating memory"); fclose(file); return NULL; } fread(buffer, 1, length, file); buffer[length] = '\0'; // Null-terminate the buffer fclose(file); return buffer; } 3. ग्राहक अनुरोधों को संभालना
अब, आने वाले क्लाइंट अनुरोधों को संभालने के लिए तर्क लागू करें।
include/request_handler.h
#ifndef REQUEST_HANDLER_H #define REQUEST_HANDLER_H #includevoid handle_client(int new_socket); #endif src/request_handler.c
#include "request_handler.h" #include "html_server.h" #include#include #include #define BUFFER_SIZE 1024 void handle_client(int new_socket) { char buffer[BUFFER_SIZE] = { 0 }; read(new_socket, buffer, BUFFER_SIZE); // Serve the HTML file char* html_content = serve_html("../html/index.html"); if (html_content) { write(new_socket, "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n", 48); write(new_socket, html_content, strlen(html_content)); } else { const char* not_found_response = "HTTP/1.1 404 Not Found\r\nContent-Type: text/html\r\n\r\n 404 Not Found
"; write(new_socket, not_found_response, strlen(not_found_response)); } free(html_content); close(new_socket); // Close the connection with the current client }4. मुख्य सर्वर तर्क
आखिरकार, आइए सब कुछ मुख्य फ़ाइल में एक साथ रखें।
src/main.c
#include#include #include #include #include #include "socket_utils.h" #include "request_handler.h" int main() { int server_fd, new_socket; struct sockaddr_in address; int addrlen = sizeof(address); server_fd = initialize_server(&address); if (server_fd == -1) { return EXIT_FAILURE; } printf("Server listening on port: 8080\n"); while (1) { if ((new_socket = accept(server_fd, (struct sockaddr*)&address, (socklen_t*)&addrlen)) भविष्य की योजनाएं
आगे बढ़ते हुए, हम कई संवर्द्धन और सुविधाएँ लागू करने की योजना बना रहे हैं:
- मल्टी-थ्रेडिंग सपोर्ट: एक साथ कई क्लाइंट कनेक्शन को संभालने के लिए, हम सर्वर की दक्षता में सुधार के लिए थ्रेडिंग क्षमताओं को पेश करेंगे।
- डायनामिक कंटेंट सर्विंग: हल्के टेम्पलेटिंग इंजन के साथ एकीकृत करके डायनामिक कंटेंट परोसने के लिए कार्यक्षमता लागू करें।
- लॉगिंग: अनुरोधों, त्रुटियों और सर्वर प्रदर्शन को ट्रैक करने के लिए एक लॉगिंग तंत्र जोड़ें।
- सुरक्षा सुविधाएं: सुरक्षा बढ़ाने के लिए HTTPS समर्थन और इनपुट सत्यापन जोड़ने का अन्वेषण करें।
- बेहतर त्रुटि प्रबंधन: विभिन्न परिदृश्यों के लिए बेहतर त्रुटि प्रबंधन लागू करें, जैसे फ़ाइल नहीं मिली, सर्वर अधिभार, आदि।
निष्कर्ष
यह सरल टीसीपी सर्वर प्रोजेक्ट भाषा की शक्ति और सरलता को प्रदर्शित करते हुए सी में एक वेब सर्वर बनाने का एक मूलभूत उदाहरण के रूप में कार्य करता है। इस नींव पर निर्माण करके, हम अधिक परिष्कृत सुविधाएँ विकसित कर सकते हैं और प्रदर्शन में सुधार कर सकते हैं, जिससे यह वेब सामग्री की सेवा के लिए एक मजबूत समाधान बन सकता है।
आप संपूर्ण स्रोत कोड पा सकते हैं और GitHub: GitHub रिपॉजिटरी लिंक पर प्रोजेक्ट में योगदान कर सकते हैं।
बेझिझक प्रतिक्रिया दें, प्रश्न पूछें, या भविष्य में सुधार के लिए अपने विचारों का योगदान करें!
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3