استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين
استخدم Boost.Asio لتنفيذ إدخال وإخراج غير متزامنين حديثين وقابلين للنقل.
استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.
Boost.Asio
تُعد Boost.Asio مكتبة الإدخال والإخراج غير المتزامن الفعلية في C++. وهي متعددة المنصات، وشبه مكتبة ترويسات فقط، وتستخدمها خدمات لا حصر لها في بيئات الإنتاج.
io_context
تتمحور Asio حول boost::asio::io_context، وهي حلقة الأحداث. تُنفَّذ جميع عمليات الإدخال والإخراج غير المتزامنة عليها.
#include <boost/asio.hpp>
namespace asio = boost::asio;
asio::io_context io;
// register async operations...
io.run();المستقبِلات والمقابس
يستمع ip::tcp::acceptor إلى الاتصالات الواردة، بينما يتولى ip::tcp::socket معالجة الاتصالات الفردية.
asio::ip::tcp::acceptor acceptor(io,
{asio::ip::tcp::v4(), 8080});
asio::ip::tcp::socket socket(io);
acceptor.async_accept(socket, [&](auto err) {
if (!err) handle(std::move(socket));
});نمط الاستدعاء اللاحق
تتلقى العمليات غير المتزامنة معالج إكمال، وعادةً ما يكون lambda. ويعمل المعالج على خيط تنفيذ io_context عند اكتمال العملية.
asio::async_read(socket, asio::buffer(buf),
[](auto err, size_t n) {
if (!err) std::cout << "read " << n << " bytes";
});نمط coroutine (C++20)
تدعم Asio الحديثة coroutines الخاصة بـ C++20؛ فتُكتب مثل الشيفرة المتزامنة، لكنها تعمل بصورة غير متزامنة.
asio::awaitable<void> handle(asio::ip::tcp::socket sock) {
char buf[1024];
auto n = co_await sock.async_read_some(asio::buffer(buf), asio::use_awaitable);
co_await asio::async_write(sock, asio::buffer(buf, n), asio::use_awaitable);
}Strands لسلامة خيوط التنفيذ
شغّل عدة خيوط تنفيذ لـ io_context، لكن استخدم strand لتسلسل المعالجات التي تتعامل مع البيانات نفسها، مما يوفر أمانًا دون أقفال.
المؤقتات
تتضمن Asio مؤقتات مدمجة في io_context. جدولة العمل ليُنفّذ بعد تأخير.
asio::steady_timer timer(io, std::chrono::seconds(5));
timer.async_wait([](auto err) {
std::cout << "5 seconds passed";
});المخازن المؤقتة
تغلّف asio::buffer الذاكرة لاستخدامها في الإدخال والإخراج، وتعمل مع المتجهات والمصفوفات والسلاسل النصية.
std::vector<char> data(1024);
async_read(sock, asio::buffer(data), handler);معالجة الأخطاء
تتلقى المعالجات غير المتزامنة كائن error_code. استخدمه بدلًا من الاستثناءات في حالات الفشل المتوقعة، مثل انقطاع الاتصال وانتهاء المهلة.
Asio المستقلة
تتوفر Asio كمكتبة مستقلة دون اعتماد على Boost، وهذا مفيد للمشروعات التي تريد تجنب Boost.
الأداء
تُعد Asio إحدى أسرع مكتبات C++ للإدخال والإخراج غير المتزامن. ويمكنها التوسع لخدمة اتصالات متزامنة عديدة في خيط تنفيذ واحد، كما تدعم مثيلات io_context متعددة الخيوط.
متى تُستخدم
استخدم Asio من أجل:
- خوادم الشبكات عالية الأداء
- الإدخال والإخراج غير المتزامن متعدد المنصات
- الشيفرة غير المتزامنة القائمة على coroutines
- أي شيء يتطلب عشرات الآلاف من الاتصالات
تحقق سريع
ما الكائن المركزي في Boost.Asio الذي يدير معالجة الأحداث؟
مراجعة
توفر Boost.Asio إدخالًا وإخراجًا غير متزامنين ومتعددي المنصات. يدير io_context حلقة الأحداث. استخدم الاستدعاءات اللاحقة للنمط التقليدي أو coroutines للحصول على شيفرة غير متزامنة تبدو متزامنة. وتعمل Asio المستقلة دون Boost.
الأسئلة الشائعة
هل درس «استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين» مجاني؟
نعم — نص درس «استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.
ماذا ستتعلم في «استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين»؟
استخدم Boost.Asio لتنفيذ إدخال وإخراج غير متزامنين حديثين وقابلين للنقل. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟
لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟
نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- واجهة BSD Sockets API في C++
- بناء خادم صدى TCP
- الإدخال والإخراج غير المتزامنين باستخدام epoll وkqueue
- استخدام Boost Asio للإدخال والإخراج غير المتزامنين الحديثين