C++ में नेटवर्क प्रोग्रामिंग: सॉकेट से एसिंक्रोनस तक

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

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\n

मूल बातें: सॉकेट और OSI मॉडल

\n

कोड लिखने से पहले, आइए याद करें कि सॉकेट क्या है। यह एक अमूर्तता है जो एप्लिकेशन को नेटवर्क पर डेटा भेजने और प्राप्त करने की अनुमति देती है। C++ में, हम sys/socket.h (Linux) या winsock2.h (Windows) के माध्यम से काम करते हैं।

\n\n

TCP बनाम UDP: कब क्या उपयोग करें?

\n
    \n
  • TCP (SOCK_STREAM): डिलीवरी और पैकेट के क्रम की गारंटी देता है। चैट, HTTP, डेटाबेस के लिए आदर्श।
  • \n
  • UDP (SOCK_DGRAM): तेज़, लेकिन बिना गारंटी के। स्ट्रीमिंग, DNS, ऑनलाइन गेम में उपयोग किया जाता है (जहाँ पैकेट खोना विलंब से बेहतर है)।
  • \n
\n\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 <                

ब्लॉग

पुस्तक अनुशंसाएँ