0Pricing
C Academy · درس

عميل TCP

الاتصال والإرسال

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

بناء عميل TCP

يتصل عميل TCP بخادم، ثم يرسل البيانات ويستقبلها. ودورة حياته أقصر من دورة حياة الخادم: إنشاء مقبس، والاتصال، والتواصل، ثم الإغلاق.

الخطوة 1: إنشاء المقبس

كما في الخادم، أنشئ مقبس تدفق لـ IPv4 TCP.

#include <sys/socket.h>
#include <stdio.h>

int make_client_socket(void) {
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd < 0) perror("socket");
    return fd;
}

الخطوة 2: وصف الخادم

املأ sockaddr_in بمنفذ الخادم وعنوان IP الخاص به. استخدم inet_pton لتحويل سلسلة IP المنقوطة إلى صيغة ثنائية.

#include <arpa/inet.h>
#include <netinet/in.h>

int set_server(struct sockaddr_in *addr, const char *ip, unsigned short port) {
    addr->sin_family = AF_INET;
    addr->sin_port = htons(port);
    return inet_pton(AF_INET, ip, &addr->sin_addr); /* 1 on success */
}

الخطوة 3: الاتصال

ينفّذ connect() عملية المصافحة الخاصة بـ TCP مع الخادم. عند النجاح يصبح المقبس جاهزًا للبيانات، وعند الفشل يضبط errno، مثلًا عند رفض الاتصال.

#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>

int do_connect(int fd, struct sockaddr_in *addr) {
    if (connect(fd, (struct sockaddr *)addr, sizeof *addr) < 0) {
        perror("connect"); return -1;
    }
    return 0;
}

لا حاجة إلى bind

يتخطى العملاء عادةً bind؛ إذ تعيّن النواة تلقائيًا منفذ مصدر مؤقتًا أثناء connect. لا تربط العميل إلا إذا كنت تحتاج إلى منفذ مصدر محدد.

الخطوة 4: إرسال البيانات

بعد الاتصال، اكتب طلبًا باستخدام send. كرّر العملية لضمان إرسال المخزن المؤقت كاملًا.

#include <sys/socket.h>
#include <string.h>

int send_all(int fd, const char *data) {
    size_t left = strlen(data);
    const char *p = data;
    while (left > 0) {
        ssize_t n = send(fd, p, left, 0);
        if (n <= 0) return -1;
        p += n; left -= (size_t)n;
    }
    return 0;
}

الخطوة 5: استقبال الرد

اقرأ استجابة الخادم باستخدام recv. أضف محرف النهاية الصفري قبل التعامل مع المخزن المؤقت كسلسلة نصية.

#include <sys/socket.h>
#include <stdio.h>

void read_reply(int fd) {
    char buf[512];
    ssize_t n = recv(fd, buf, sizeof buf - 1, 0);
    if (n > 0) { buf[n] = 0; printf("server said: %s\n", buf); }
    else if (n == 0) printf("server closed connection\n");
}

القراءة حتى الإغلاق

قد لا تعيد عملية recv واحدة الاستجابة كاملة. كرّر العملية حتى تعيد recv القيمة 0، أي حتى يغلق الطرف الآخر، لقراءة الرد الكامل الذي يصل على أجزاء.

#include <sys/socket.h>
#include <stdio.h>

void drain(int fd) {
    char buf[256]; ssize_t n;
    while ((n = recv(fd, buf, sizeof buf, 0)) > 0)
        fwrite(buf, 1, (size_t)n, stdout);
}

الخطوة 6: الإغلاق

استدعِ close(fd) لإنهاء الاتصال وتحرير واصف الملف. يرسل ذلك إشارة TCP FIN، فيعرف الخادم أن العميل انتهى.

#include <unistd.h>

void finish(int fd) {
    close(fd);
}

الإغلاق الجزئي باستخدام shutdown

يغلق shutdown(fd, SHUT_WR) اتجاه الكتابة فقط، مشيرًا إلى انتهاء الطلب، مع السماح للعميل بمواصلة قراءة الرد. وهذا مفيد في البروتوكولات التي تتبع نمط الطلب ثم الاستجابة.

التعامل مع حالات فشل الاتصال

أخطاء العميل الشائعة: ECONNREFUSED (لا يوجد خادم يستمع)، وETIMEDOUT (تعذّر الوصول إلى المضيف)، وEHOSTUNREACH. تحقّق دائمًا من connect وأبلغ المستخدم بحالات الفشل بوضوح.

تحقّق سريع

اختبر مدى فهمك لعملاء TCP.

مراجعة

لقد بنيتم عميل TCP.

  • أنشئوا socket، ثم اتصلوا بـ sockaddr_in الخاص بالخادم باستخدام connect
  • لا حاجة إلى bind؛ إذ يختار النواة منفذ المصدر
  • أرسلوا الطلب، واستقبلوا الرد باستخدام recv (كرّروا العملية للحصول على البيانات كاملة)
  • استخدموا close أو shutdown عند الانتهاء، وتعاملوا مع حالات فشل الاتصال

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

هل درس «عميل TCP» مجاني؟

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

ماذا ستتعلم في «عميل TCP»؟

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

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

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

كم من الوقت يستغرق درس «عميل TCP»؟

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

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

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

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

  1. نظرة عامة على المقابس
  2. خادم TCP
  3. عميل TCP
  4. معالجة عدة عملاء
← العودة إلى C Academy