C++ में नेटवर्क प्रोग्रामिंग: सॉकेट से एसिंक्रोनस तक
\n\nक्या आपने कभी सोचा है कि चैट, ऑनलाइन गेम या वेब सर्वर कैसे काम करते हैं? इन सबके मूल में नेटवर्क संचार है। और यदि आप तेज़, विश्वसनीय और निम्न-स्तरीय नेटवर्क एप्लिकेशन लिखना चाहते हैं, तो C++ में नेटवर्क प्रोग्रामिंग वही है जो आपको चाहिए। इस लेख में हम केवल सिद्धांत पर नहीं चलेंगे, बल्कि वास्तविक कोड लिखेंगे: एक साधारण TCP चैट से लेकर Boost.Asio के साथ एक एसिंक्रोनस सर्वर तक। अपने IDE तैयार रखें - यह दिलचस्प होने वाला है!
\n\nनेटवर्क के लिए C++ क्यों? तीन कारण
\nबहुत से लोग नेटवर्क कार्यों के लिए Python या Java चुनते हैं, लेकिन C++ तीन प्रमुख लाभ देता है:
\n- \n
- गति: न्यूनतम ओवरहेड, सिस्टम कॉल (syscalls) तक सीधी पहुँच। \n
- नियंत्रण: आप मैन्युअल रूप से मेमोरी, बफ़र्स और टाइमिंग को नियंत्रित करते हैं। \n
- पारिस्थितिकी तंत्र:
Boost.Asio,libcurl,Poco- किसी भी कार्य के लिए शक्तिशाली लाइब्रेरीज़। \n
लेकिन बड़ी शक्ति के साथ बड़ी जिम्मेदारी भी आती है: सॉकेट प्रबंधन में एक गलती और आपका सर्वर क्रैश हो जाएगा। आइए समझें कि इससे कैसे बचा जाए।
\n\nमूल बातें: सॉकेट और OSI मॉडल
\nकोड लिखने से पहले, आइए याद करें कि सॉकेट क्या है। यह एक अमूर्तता है जो एप्लिकेशन को नेटवर्क पर डेटा भेजने और प्राप्त करने की अनुमति देती है। C++ में, हम sys/socket.h (Linux) या winsock2.h (Windows) के माध्यम से काम करते हैं।
TCP बनाम UDP: कब क्या उपयोग करें?
\n- \n
- TCP (SOCK_STREAM): डिलीवरी और पैकेट के क्रम की गारंटी देता है। चैट, HTTP, डेटाबेस के लिए आदर्श। \n
- UDP (SOCK_DGRAM): तेज़, लेकिन बिना गारंटी के। स्ट्रीमिंग, DNS, ऑनलाइन गेम में उपयोग किया जाता है (जहाँ पैकेट खोना विलंब से बेहतर है)। \n
C++ में TCP सर्वर और क्लाइंट लिखना (शुद्ध सॉकेट)
\nआइए एक सरल इको सर्वर बनाएँ। यह एक संदेश प्राप्त करता है और उसे वापस भेजता है। यह नेटवर्क प्रोग्रामिंग में एक क्लासिक "Hello, World" है।
\n\nसर्वर भाग (echo_server.cpp)
\n#include <iostream>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <unistd.h>\n#include <cstring>\n\nint main() {\n int server_fd, client_fd;\n struct sockaddr_in address;\n int opt = 1;\n int addrlen = sizeof(address);\n char buffer[1024] = {0};\n\n // 1. सॉकेट बनाएँ\n if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {\n perror("socket failed");\n exit(EXIT_FAILURE);\n }\n\n // 2. पोर्ट से बाइंड करें (reuse port विकल्प)\n if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {\n perror("setsockopt");\n exit(EXIT_FAILURE);\n }\n address.sin_family = AF_INET;\n address.sin_addr.s_addr = INADDR_ANY;\n address.sin_port = htons(8080);\n\n if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {\n perror("bind failed");\n exit(EXIT_FAILURE);\n }\n\n // 3. इनकमिंग कनेक्शन सुनें\n if (listen(server_fd, 3) < 0) {\n perror("listen");\n exit(EXIT_FAILURE);\n }\n\n std::cout << "सर्वर पोर्ट 8080 पर शुरू हुआ। कनेक्शन की प्रतीक्षा..." << std::endl;\n\n // 4. क्लाइंट को स्वीकार करें\n if ((client_fd = accept(server_fd, (struct sockaddr *)&address,\n (socklen_t*)&addrlen)) < 0) {\n perror("accept");\n exit(EXIT_FAILURE);\n }\n\n // 5. पढ़ें और वापस भेजें (इको)\n int valread = read(client_fd, buffer, 1024);\n std::cout << "प्राप्त: " << buffer << std::endl;\n send(client_fd, buffer, strlen(buffer), 0);\n std::cout << "इको उत्तर भेजा गया" << std::endl;\n\n close(client_fd);\n close(server_fd);\n return 0;\n}\n\nक्लाइंट भाग (echo_client.cpp)
\n#include <