واجهة BSD Sockets API في C++
استخدم socket وbind وlisten وaccept وconnect وsend وrecv في برامج C++.
واجهة BSD Sockets API في C++ درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
ما هي واجهة Sockets API؟
تُعد واجهة BSD sockets API المعيار الفعلي لبرمجة الشبكات، وهي متاحة على Linux وmacOS وأنظمة BSD، وكذلك على Windows عبر Winsock مع بعض التعديلات البسيطة.
الترويسات المطلوبة
ضمّن ترويسات المنصة واستخدم أنواع POSIX.
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>إنشاء مقبس
تعيد استدعاءة socket واصف ملف. مرّر عائلة العناوين (IPv4) والنوع (TCP أو UDP) والبروتوكول (0 لاستخدام الإعداد الافتراضي).
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket");
return 1;
}هياكل العناوين
يخزّن struct sockaddr_in عنوان IPv4 والمنفذ. حوّله إلى struct sockaddr* عند تمريره إلى الدوال.
struct sockaddr_in addr{};
addr.sin_family = AF_INET;
addr.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr);ترتيب البايتات: المضيف مقابل الشبكة
يستخدم ترتيب بايتات الشبكة الترتيب الكبير. استخدم htons وhtonl وntohs وntohl للتحويل.
اتصال العميل
استخدم connect لبدء اتصال TCP.
if (connect(sock, (sockaddr*)&addr, sizeof(addr)) < 0) {
perror("connect");
close(sock);
return 1;
}الإرسال والاستقبال
تتبادل send وrecv البايتات. وقد تعيد كل منهما عددًا أقل من العدد المطلوب، لذا كرر العملية داخل حلقة دائمًا.
const char* msg = "Hello";
send(sock, msg, strlen(msg), 0);
char buffer[1024];
ssize_t n = recv(sock, buffer, sizeof(buffer)-1, 0);
buffer[n] = '\0';الربط والاستماع (الخادم)
يربط الخادم نفسه بعنوان، ثم يستمع ويقبل الاتصالات.
int srv = socket(AF_INET, SOCK_STREAM, 0);
bind(srv, (sockaddr*)&addr, sizeof(addr));
listen(srv, 10);
int client = accept(srv, nullptr, nullptr);إغلاق المقبس
استدعِ close على Unix أو closesocket على Windows.
close(sock);معالجة الأخطاء
تعيد دوال المقابس -1 عند حدوث خطأ وتضبط errno. تحقّق من كل قيمة معادة.
التغليف باستخدام RAII
من السهل تسرّب واصفات الملفات غير المغلّفة. غلّفها في نوع يستخدم RAII ويستدعي close في المدمّر، أو استخدم std::unique_ptr مع دالة حذف مخصّصة.
struct SocketCloser {
void operator()(int* fd) const { if (*fd >= 0) ::close(*fd); }
};
using UniqueSocket = std::unique_ptr<int, SocketCloser>;الاختلافات في Windows
على Windows:
- ضمّن
<winsock2.h>واربطws2_32 - استدعِ
WSAStartupقبل الاستخدام - استخدم
closesocketبدلًا منclose - نوع المقبس هو
SOCKET(غير موقّع)
تحقق سريع
أي استدعاء دالة يبدأ اتصال TCP من عميل إلى خادم؟
مراجعة
توفر واجهة BSD sockets API بدائيات منخفضة المستوى للشبكات. أنشئ مقبسًا، واضبط عنوانًا، ثم استخدم connect (للعميل) أو bind+listen+accept (للخادم). حوّل ترتيب البايتات باستخدام عائلة htons. غلّف الواصفات باستخدام RAII لمنع تسرّبها.
الأسئلة الشائعة
هل درس «واجهة BSD Sockets API في C++» مجاني؟
نعم — نص درس «واجهة BSD Sockets API في C++» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «واجهة BSD Sockets API في C++»؟
استخدم socket وbind وlisten وaccept وconnect وsend وrecv في برامج C++. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «واجهة BSD Sockets API في C++»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- واجهة BSD Sockets API في C++
- بناء خادم صدى TCP
- الإدخال والإخراج غير المتزامنين باستخدام epoll وkqueue
- استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين