0Pricing
C++ Academy · درس

بناء خادم صدى TCP

تعرّف خطوة بخطوة إلى تنفيذ خادم صدى TCP كامل.

بناء خادم صدى TCP درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

الهدف

أنشئ خادم TCP بسيطًا يقبل اتصالًا، ويقرأ البايتات، ثم يكتبها مرة أخرى. هذا هو «Hello World» في برمجة الشبكات.

هيكل الخادم

يتكوّن مسار الخادم من: إنشاء المقبس، والربط، والاستماع، والقبول، والمعالجة. كرر ذلك إلى ما لا نهاية.

int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
while (true) {
    int client = accept(srv, nullptr, nullptr);
    handle(client);
    close(client);
}

خيار إعادة استخدام العنوان

اضبط SO_REUSEADDR حتى يتمكن الخادم من إعادة التشغيل فورًا دون انتظار تحرير نظام التشغيل للمنفذ.

int yes = 1;
setsockopt(srv, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));

حلقة الصدى

اقرأ البيانات في مخزن مؤقت، ثم اكتب البايتات نفسها مرة أخرى. توقف عندما يغلق العميل الاتصال.

void handle(int client) {
    char buf[1024];
    while (true) {
        ssize_t n = recv(client, buf, sizeof(buf), 0);
        if (n <= 0) break;          // closed or error
        send(client, buf, n, 0);
    }
}

القراءات والكتابات الجزئية

يمكن لكل من recv وsend نقل عدد من البايتات أقل من العدد المطلوب. في البروتوكول القائم على التدفق، كرر العملية داخل حلقة حتى تكتمل.

ssize_t total = 0;
while (total < n) {
    ssize_t s = send(client, buf + total, n - total, 0);
    if (s <= 0) break;
    total += s;
}

معالجة عملاء متعددين

النهج الأبسط هو إنشاء خيط تنفيذ جديد لكل اتصال. ينجح ذلك مع مئات العملاء، لكنه يواجه صعوبات مع الآلاف.

while (true) {
    int client = accept(srv, nullptr, nullptr);
    std::thread([client]{ handle(client); close(client); }).detach();
}

الأفضل: تجمع خيوط التنفيذ

يؤدي إنشاء خيط تنفيذ لكل اتصال إلى هدر الموارد عند التوسع. أما تجمع خيوط تنفيذ ثابت مع قائمة انتظار للعمل فيتوسع بصورة أفضل.

إيقاف التشغيل بسلاسة

عالج SIGTERM/SIGINT لإغلاق مقبس الاستماع بطريقة سليمة. ويساعد RAII على ضمان إغلاق جميع مقابس العملاء أيضًا.

معالجة الأخطاء

تعامل مع الأخطاء باعتبارها متوقعة: فقد ينقطع العملاء، وقد تتعثر الشبكات، وقد تنفد حدود نظام التشغيل. سجّل الخطأ وتابع التنفيذ، ولا تتسبب في انهيار الخادم بسبب عميل غير صالح.

تسجيل كل عميل

سجّل العنوان البعيد لأغراض قابلية المراقبة.

sockaddr_in remote{};
socklen_t len = sizeof(remote);
int client = accept(srv, (sockaddr*)&remote, &len);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &remote.sin_addr, ip, sizeof(ip));
std::cout << "client " << ip << ":" << ntohs(remote.sin_port);

الاختبار باستخدام netcat

اختبر خادم الصدى تفاعليًا باستخدام nc.

nc 127.0.0.1 8080
hello
hello       # echoed back

ما بعد الصدى

يمكنك توسيع خادم الصدى ليشمل:

  • بروتوكولات قائمة على الأسطر (شبيهة بـ HTTP)
  • بروتوكولات ثنائية مؤطّرة (بطول مسبوق)
  • رسائل JSON أو Protobuf

تحقق سريع

ما الغرض من خيار المقبس SO_REUSEADDR؟

مراجعة

يتكوّن خادم صدى TCP البسيط من: socket وsetsockopt SO_REUSEADDR وbind وlisten وحلقة accept. لمعالجة عملاء متعددين، أنشئ خيوط تنفيذ أو استخدم تجمع خيوط تنفيذ. وللتوسع الكبير، انتقل إلى الإدخال والإخراج غير المتزامن (في الدرس التالي).

الأسئلة الشائعة

هل درس «بناء خادم صدى TCP» مجاني؟

نعم — نص درس «بناء خادم صدى TCP» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «بناء خادم صدى TCP»؟

تعرّف خطوة بخطوة إلى تنفيذ خادم صدى TCP كامل. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «بناء خادم صدى TCP»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. واجهة BSD Sockets API في C++
  2. بناء خادم صدى TCP
  3. الإدخال والإخراج غير المتزامنين باستخدام epoll وkqueue
  4. استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين
← العودة إلى C++ Academy