جستجو در تالارهای گفتگو
در حال نمایش نتایج برای برچسب های 'boost'.
4 نتیجه پیدا شد
-
کتابخانهٔ Boost: یک راهکار قدرتمند برای توسعهٔ برنامههای سیپلاسپلاس مقدمه کتابخانهٔ Boost یکی از مهمترین ابزارها در دنیای برنامهنویسی سیپلاسپلاس است. این کتابخانه کاملاً رایگان بوده و مجموعهای گسترده از کتابخانهها و ابزارهای مفید برای توسعهدهندگان این زبان فراهم میکند. در این مقاله، به بررسی ویژگیها، اهمیت و کاربرد کتابخانهٔ Boost در سیپلاسپلاس میپردازیم. ۱. ویژگیهای کتابخانهٔ Boost کتابخانهٔ Boost دارای ویژگیهای فراوانی است که آن را از سایر کتابخانهها متمایز میکند. به برخی از این ویژگیها در زیر اشاره خواهیم کرد: الف. تعداد زیادی ابزار و کتابخانه Boost شامل تعداد زیادی از کتابخانهها و ابزارهای مفید است که برای تسهیل و افزایش کارایی در توسعهٔ نرمافزارهای سیپلاسپلاس به کار میروند. برخی از این کتابخانهها شامل: کتابخانهٔ Boost.Filesystem: برای مدیریت فایلها و دایرکتوریها در سیستم عامل استفاده میشود. کتابخانهٔ Boost.Thread: برای پشتیبانی از نخها (Thread) و همزمانسازی استفاده میشود. کتابخانهٔ Boost.Regex: برای پردازش و مدیریت عبارات باقاعده (Regular Expressions) به کار میرود. ب. پشتیبانی از استانداردهای مدرن Boost به خوبی استانداردهای مدرن سیپلاسپلاس را پشتیبانی میکند. این کتابخانه ابزارها و قابلیتهایی ارائه میدهد که توسعهدهندگان را در استفاده از قابلیتهای جدید و بهبودیافتهٔ زبان کمک میکند. با استفاده از Boost، میتوانید از استانداردهای مدرن مانند C++11 و C++14 بهرهبرداری کنید و کدهای بهتری بنویسید. ۲. اهمیت Boost برای توسعهٔ سیپلاسپلاس کتابخانهٔ Boost اهمیت فراوانی در توسعهٔ سیپلاسپلاس دارد. به دلیل وجود ابزارها و کتابخانههای متنوع، Boost به توسعهدهندگان این زبان کمک میکند تا برنامههای قدرتمندی را با سرعت و کارایی بالا ایجاد کنند. همچنین، استفاده از Boost باعث میشود که کد نوشته شده توسط توسعهدهندگان با استانداردهای مدرن و قابلیتهای بهبودیافتهٔ زبان همخوانی داشته باشد. ۳. کاربرد کتابخانهٔ Boost در سیپلاسپلاس کتابخانهٔ Boost در سیپلاسپلاس در بسیاری از زمینهها کاربرد دارد. در ادامه به برخی از کاربردهای این کتابخانه میپردازیم: الف. توسعهٔ برنامههای شبکه Boost ابزارها و کتابخانههای قدرتمندی برای توسعهٔ برنامههای شبکه در سیپلاسپلاس فراهم میکند. از طریق Boost.Asio میتوانید به راحتی بر نامههایی با استفاده از پروتکلهای مختلف شبکه مانند TCP و UDP بنویسید و با سرعت و کارایی بالا با ارتباطات شبکه کار کنید. ب. پردازش و مدیریت رشتهها Boost.Regex ابزاری قدرتمند برای پردازش و مدیریت رشتهها در سیپلاسپلاس است. این کتابخانه امکان استفاده از عبارات باقاعده را فراهم میکند و کار با رشتهها را بسیار آسان میکند. با استفاده از Boost.Regex، میتوانید الگوهای مورد نظر خود را در رشتهها جستجو کنید و اقدامات لازم را انجام دهید. ۴. مزایای استفاده از کتابخانهٔ Boost استفاده از کتابخانهٔ Boost در توسعهٔ پروژههای سیپلاسپلاس دارای مزایای بسیاری است. به دلیل ویژگیها و قابلیتهای فراوان این کتابخانه، میتوانید از مزایای زیر بهرهبرداری کنید: الف. افزایش کارایی و سرعت کتابخانهٔ Boost ابزارها و الگوریتمهایی را ارائه میدهد که میتواند عملکرد و کارایی برنامهها را بهبود بخشید. با استفاده از این ابزارها، میتوانید بهینهسازیهای لازم را انجام داده و کارایی برنامههای خود را افزایش دهید. این موضوع بسیار مهم است زیرا کارایی و سرعت اجرای یک برنامه بر روی سیستمهای حساس به زمان اهمیت بسیاری دارد. ب. پشتیبانی از چندپلتفرم کتابخانهٔ Boost بر روی چندپلتفرم قابل استفاده است و از این جهت بسیار مفید است. اگر برنامهٔ شما باید روی سیستمعاملهای مختلف اجرا شود، Boost میتواند به شما در این مسئله کمک کند. شما میتوانید از ابزارها و قابلیتهای Boost استفاده کنید تا برنامهٔ خود را به طور مستقل از سیستمعامل مقصد اجرا کنید و از سهولت توسعه و نگهداری برخوردار شوید. ج. جامعیت و پایداری Boost یک کتابخانهٔ بسیار جامع و پایدار است. این به این معناست که شما میتوانید به ابزارها و قابلیتهای Boost برای پروژههای مختلفی با انواع نیازها و مشکلات بهرهبرداری کنید. این کتابخانه توسعه یافته و توسط جامعهٔ سیپلاسپلاس حمایت میشود، بنابراین میتوانید از پشتیبانی و بهروزرسانیهای مداوم برخوردار شوید. ۵. کاربردهای کتابخانهٔ Boost کتابخانهٔ Boost به دلیل قابلیتها و امکانات فراوان خود، در زمینههای مختلفی از جمله زیر استفاده میشود: الف. توسعهٔ برنامههای کاربردی Boost ابزارها و کتابخانههایی را فراهم میکند که میتواند در توسعهٔ برنامههای کاربردی مختلف مفید باشد. مثلاً Boost.Asio برای برنامهنویسی شبکه، Boost.FileSystem برای کار با سیستمفایل و Boost.DateTime برای کار با زمان و تاریخ مورد استفاده قرار میگیرد. با استفاده از این ابزارها، میتوانید برنامههای کاربردی پیچیده را با قابلیتهای خاص و منحصربهفرد طراحی و پیادهسازی کنید. ب. توسعهٔ بسترهای نرمافزاری کتابخانهٔ Boost به عنوان یک بستر نرمافزاری مناسب برای توسعهٔ برنامههای کاربردی و تحت وب استفاده میشود. با استفاده از Boost، میتوانید بسترهای نرمافزاری پویا و پایداری ایجاد کنید که قابلیتها و خصوصیات منحصربهفردی داشته باشند. این کتابخانه شما را قادر میسازد تا بسترهای قابل گسترش، قابل تنظیم و با قابلیت انعطافپذیری بالا را پیادهسازی کنید. ج. توسعهٔ بازیها و گرافیک کامپیوتری Boost در زمینهٔ توسعهٔ بازیها و گرافیک کامپیوتری نیز استفاده میشود. ابزارهایی مانند Boost.Geometry برای کار با هندسه و Boost.Graph برای تحلیل و پردازش گرافها مورد استفاده قرار میگیرند. این ابزارها به توسعهدهندگان کمک میکنند تا الگوریتمهای پیچیده را برای بازیها و سیستمهای گرافیکی پیادهسازی کنند و تجربهٔ کاربری بهتری را ارائه دهند. ۶.اهمیت کتابخانهٔ Boost کتابخانهٔ Boost در دنیای سیپلاسپلاس بسیار اهمیت دارد. استفاده از این کتابخانه میتواند توسعهٔ برنامههای شما را سریعتر، قابل اطمینانتر و کارآمدتر کند. با قابلیتها و امکانات گستردهٔ Boost، میتوانید در توسعهٔ نرمافزارهای پیچیده و با تعامل بالا بهترین عملکرد را به دست آورید. ۷. چگونه از کتابخانهٔ Boost بهرهبرداری کنیم؟ برای بهرهبرداری از کتابخانهٔ Boost و استفاده بهینه از قابلیتهای آن، میتوانید مراحل زیر را دنبال کنید: الف. نصب کتابخانه ابتدا باید کتابخانهٔ Boost را بر روی سیستم خود نصب کنید. میتوانید نسخهٔ مناسب برای سیستمعامل خود را از وبسایت رسمی Boost دریافت کنید و طبق دستورالعملهای نصب آن را انجام دهید. ب. مستندات و منابع آموزشی بهتر است پیش از شروع استفاده از Boost، به مستندات رسمی آن مراجعه کنید. مستندات کتابخانه به شما راهنمایی دقیقی دربارهٔ ویژگیها، توابع و کلاسهای موجود در Boost ارائه میدهد. همچنین، میتوانید از منابع آموزشی آنلاین و کتابهای مرجع موجود برای یادگیری عمیقتر از Boost استفاده کنید. ج. استفاده در پروژهها با نصب کتابخانه و آشنایی با مستندات، میتوانید Boost را در پروژههای خود استفاده کنید. در هر قسمت از پروژه که نیاز به قابلیتها یا الگوریتمهای خاصی دارید، میتوانید به کتابخانهٔ Boost مراجعه کنید و از آن استفاده کنید. با استفاده از توابع و کلاسهای Boost، میتوانید کدهای کوتاهتر، بهینهتر و قابل نگهداریتری ایجاد کنید. ۸. بهترین استفاده از کتابخانهٔ Boost برای بهترین استفاده از کتابخانهٔ Boost، توصیه میشود: با استفاده از نسخهٔ مناسب Boost برای پروژه خود، بهروزرسانیها و بهبودهای ارائه شده را دنبال کنید. با دقت مستندات رسمی Boost کار کنید و قابلیتها و توابع موجود را بهخوبی بشناسید. از منابع آموزشی متنوع استفاده کنید تا مفاهیم و مباحث پیشرفتهتر را بیاموزید. در صورت نیاز، از جامعهٔ سیپلاسپلاس و انجمنهای مرتبط با Boost برای رفع سوالات و دریافت راهنمایی استفاده کنید. نتیجهگیری کتابخانهٔ Boost با ارائهٔ ابزارها و کتابخانههای مفید، اهمیت و کاربرد زیادی در توسعهٔ سیپلاسپلاس دارد. از ویژگیهای برجستهٔ این کتابخانه میتوان به تعداد زیادی ابزار و کتابخانه، پشتیبانی از استانداردهای مدرن و کاربردهای مختلف در برنامهنویسی اشاره کرد. با استفاده از Boost، توسعهدهندگان میتوانند برنامههای قدرتمندی را با سرعت و کارایی بالا ایجاد کنند و از قابلیتهای بهبودیافتهٔ زبان بهرهبرداری کنند. کتابخانهٔ Boost با ویژگیها و قابلیتهای منحصربهفرد خود، نقش بسیار مهمی در توسعهٔ پروژههای سیپلاسپلاس دارد. استفاده از این کتابخانه باعث میشود تا برنامههای قدرتمند، قابل اعتماد و با کارایی بالا ایجاد شوند. همچنین، Boost به توسعهدهندگان کمک میکند تا با استفاده از استانداردهای مدرن، بهترین نتایج را در توسعهٔ برنامهها به دست آورند.
-
- کتابخانه
- سیپلاسپلاس
-
(و 2 مورد دیگر)
برچسب زده شده با :
-
آغازی طوفانی برای پیاده سازی یک پیام رسان ساده بر پایه ++C
Max Base نوشته وبلاگ را ارسال کرد در برنامه نویسی
با سلام وقت بخیر, در این مطلب میخواهیم در مورد روش کارکرد پیام رسان ها بیشتر بدانیم و با یکدیگر کد یک پیام رسان ساده را پیاده و بررسی کنیم. طرز کار کرد پیام رسان در نظر داشته باشید که هر پیام رسانی که بر ساختار ها پیاده شده باشد از دو قسمت تشکیل شده است. نرم افزار اصلی برای مدیریت درخواست ها (سرور) نرم افزار برای کاربران (کاربر) به نرم افزار اولی سمت SERVER خواهیم گفت و به بعدی سمت CLIENT خواهیم گفت. روم یا تالار گفتگو ما تنها یک اتاق برای گفتگو در نظر میگیریم و هر کاربری که به سرور متصل شود را در همان تالار اضافه خواهیم کرد. تالار های گفتگو صرفا برای تقکیک سازی ارسال و دریافت ها و محدود کردن بازه ی کاربران مورد نظر... (ممکن است یک کاربر در چند اتاق بطور همزمان باشد.) سیستم های پیام رسان پیشرفته تر مانند تلگرام و ... تالار های زیادی را شامل می شوند. (هر کاربر خودش در کانال و گروه های مختلفی عضو است که هر کدام از آنها یک کانال متفاوت محسوب می شوند.) * دقت شود که منظور از کانال صرفا یک اتاق یا تالار گفتگو است و منظور کانال ارتباطی و پروتکل نیست. نرم افزار اصلی نرم افزار اصلی وظیفه دارد تا تمام کاربرانی که وارد تالار شده اند را به یاد داشته باشد و هر لحظه اماده دریافت درخواست هایی از طرف کاربرانش باشد. و پیام هایی را که از کاربران دریافت می کند برای تمامی کاربران دیگر هم ارسال کند که بسته به خلاقیت و نیاز می تواند هر یک از این بخش ها متفاوت طراحی شود. نرم افزار اصلی باید از قبل اجرا شده باشد. تا کاربران دیگر با استفاده از نرم افزار مخصوص به خودشان بتوانند به سرور متصل شوند و ارسال و دریافت داشته باشند. در نظر داشته باشید که اگر در نرم افزار اصلی اختلالی پیش بیایید و متوقف بشوند. قطا برای تمام کاربران مشکل پیش می آید. مگر اینکه از پایگاه های داده ی داخلی استفاده کرده باشند. (با خلاقیت می توان به گونه های متفاوتی چنین ساختاری را پیاده کرد) نرم افزار کاربران این نرم افزار جذاب ترین بخش است چرا تمام قابلیت هایی را که در اختیار کاربر قرار می دهیم را مستقیما طراحی می کنیم. در نظر داشته باشید که هر چیزی که در این نرم افزار طراحی می شود باید در نرم افزار اصلی پشتیبانی شوند... بنابراین اگر این دو بخش توسط دو فرد یا دو گروه مجزا طراحی می شوند آنها باید توسط داکیومنت ها و جلساتی به نظرات مشابه ای رسیده باشند. (اگرچه اینها تخصص و وظیفه ی تحلیلگر سیستم است! نه بطور همزمان وظیفه توسعه دهنده و برنامه نویس نرم افزار) پیاده سازی یک نمونه اکنون در نظر داریم تا با استفاده از ساختار کتابخانه BoostAsio پروژه ای را با نام BoostAsioChat ایجاد کنیم که در آن می خواهیم یک پیام رسان با حداقل ترین امکانات پایه طراحی کنیم که بیشتر جنبه شخصی و تفریحی دارد. زیرا از ساختار های استاندارد و ایمن و کاربری کاملا بدور است! (می توانید خودتان توسعه دهید و آنرا جالب تر بسازید) ساختار نرم افزار اصلی و سرور را به این صورت تعریف می کنیم : typedef deque<message> messageQueue; class participant { public: virtual ~participant() {} virtual void deliver(const message& messageItem) = 0; }; typedef shared_ptr<participant> participantPointer; class room { public: void join(participantPointer participant); void deliver(const message& messageItem); void leave(participantPointer participant); private: messageQueue messageRecents; enum { max = 200 }; set<participantPointer> participants; }; class session : public participant, public enable_shared_from_this<session> { public: session(tcp::socket socket, room& room) : socket(move(socket)), room_(room); void start(); void deliver(const message& messageItem); private: void readHeader(); void readBody(); void write(); tcp::socket socket; room& room_; message messageItem; messageQueue Messages; }; class server { public: server(boost::asio::io_context& io_context, const tcp::endpoint& endpoint) : acceptor(io_context, endpoint); private: void do_accept(); tcp::acceptor acceptor; room room_; }; int main(int argc, char* argv[]); ساختار نرم افزار کاربر را هم به این صورت تعریف می کنیم : typedef deque<message> messageQueue; class client { public: client(boost::asio::io_context& context, const tcp::resolver::results_type& endpoints) : context(context), socket(context); void write(const message& messageItem); void close(); private: void connect(const tcp::resolver::results_type& endpoints); void readHeader(); void readBody(); void write(); boost::asio::io_context& context; tcp::socket socket; message readMessage; messageQueue writeMessage; }; int main(int argc, char* argv[]); در نظر داریم تا در این پروژه از thread ها نیز استفاده کنیم... در مورد این مفهوم ها می توانید بصورت مجزا تحقیق کنید. بنابراین روش کامپایل این پروژه به این صورت خواهد بود : $ g++ client.cpp -lpthread -o client $ g++ Server.cpp -lpthread -o server آزمایش همانطور که گفته شد در ابتدا نرم افزار اصلی و سرور باید اجرا شود. در اینجا ما تمام ارتباطات شبکه را بر روی یک سیستم در شبکه داخلی برقرار خواهیم کرد... پس نگرانی در مورد ساختار های درونی شبکه و آی پی / دی ان اس / دامین نخواهیم داشت. بنابراین ای پی را می توانید ای پی داخلی یا localhost در نظر بگیرید. برای آزمایش پورت فرضی 4000 را در نظر میگیریم و نرم افزار اصلی را روی این پورت اجرا میکنیم : $ ./server 4000 در این مرحله متوجه می شوید که نرم افزار اصلی با موفقیت اجرا شده است و همچنان اجرا مانده است. بله درست است... نرم افزار اصلی هر لحظه باید منتظر دستور کاربران باشد. اگر لحظه ای برای نرم افزار اصلی اختلالی پیش آید نخواهد توانست دستورات کاربران را انجام یا پاسخ دهد. بنابراین این پردازش را قطع نکنید و اجازه دهید تا نرم افزار اصلی اجرا بماند. در محیط دیگری نرم افزار سمت کاربر را نیز اجرا کنید. این نرم افزار را می توانید به تعداد دلخواه وارد کنید. (همانطور که ممکن است 6 نفر همزمان به سرور متصل باشند / یا ممکن است هیچ فردی به سرور متصل نشوند) ابتدا یک کاربری را به سرور با پورت 4000 و شبکه داخلی وصل می کنیم : $ ./client localhost 4000 first user: you can type message here... حال در محیط دیگری با کاربر جدیدی نیز وارد می شویم : $ ./client localhost 4000 second user: you can type message here... در این پروژه نمونه از کاربران نام کاربری یا نام نمی پرسیم.. و صرفا وقتی وارد محیط گفتگو می شوند... یا زمانی که به سرور متصل می شوند منتظر هستیم تا انها پیامی را بنویسند... هر پیامی را که بنویسند به سرور ارسال می شود و سرور وظیفه دارد تا آنرا برای تمام کاربران بفرستد. و این روند درون یک حلقه بی نهایت تکرار می شوند. پس این ارتباط دو طرفه خواهد بود و هم کاربران برای سرور اطلاعات ارسال می کنند و هم سرور برای کاربران اطلاعات ارسال خواهد کرد. در نظر داشته باشید که کاربر اول می تواند پیامی را بنویسد و به کاربران دیگر ارسال شود. ممکن است کاربر سومی اصلا تصمیمی به نوشتن پیام نداشته باشد و صرفا تمایل به خواندن پیام دیگران داشته باشند. و این کاملا اختیاری است. و ما کاربران را اجباری نمیکنیم. اگرچه شما می توانید با خلاقیت خودتان اینها را با متغییر های کمکی و دستورات شرطی پیاده کنید. کد ها برای پیام ها یک ساختار در نظر میگیریم و بصورت مشترک در هر دو نرم افزار استفاده خواهیم کرد... بنابراین اینرا در هدر پیاده خواهیم کرد. هدر پیام : (message.hpp) #ifndef message_HPP #define message_HPP #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; class message { public: enum { headerLength = 4 }; enum { maxBodyLength = 512 }; message() : bodyLength_(0) { } const char* data() const { return data_; } char* data() { return data_; } size_t length() const { return headerLength + bodyLength_; } const char* body() const { return data_ + headerLength; } char* body() { return data_ + headerLength; } size_t bodyLength() const { return bodyLength_; } void bodyLength(size_t new_length) { bodyLength_ = new_length; if(bodyLength_ > maxBodyLength) bodyLength_ = maxBodyLength; } bool decodeHeader() { char header[headerLength + 1] = ""; strncat(header, data_, headerLength); bodyLength_ = atoi(header); if(bodyLength_ > maxBodyLength) { bodyLength_ = 0; return false; } return true; } void encodeHeader() { char header[headerLength + 1] = ""; sprintf(header, "%4d", static_cast<int>(bodyLength_)); memcpy(data_, header, headerLength); } private: char data_[headerLength + maxBodyLength]; size_t bodyLength_; }; #endif نرم افزار اصلی و سرور : (server.cpp) #include <iostream> #include <cstdlib> #include <deque> #include <memory> #include <list> #include <set> #include <utility> #include <boost/asio.hpp> #include "message.hpp" using boost::asio::ip::tcp; using namespace std; typedef deque<message> messageQueue; class participant { public: virtual ~participant() {} virtual void deliver(const message& messageItem) = 0; }; typedef shared_ptr<participant> participantPointer; class room { public: void join(participantPointer participant) { participants.insert(participant); for(auto messageItem: messageRecents) participant->deliver(messageItem); } void deliver(const message& messageItem) { messageRecents.push_back(messageItem); while(messageRecents.size() > max) messageRecents.pop_front(); for(auto participant: participants) participant->deliver(messageItem); } void leave(participantPointer participant) { participants.erase(participant); } private: messageQueue messageRecents; enum { max = 200 }; set<participantPointer> participants; }; class session : public participant, public enable_shared_from_this<session> { public: session(tcp::socket socket, room& room) : socket(move(socket)), room_(room) { } void start() { room_.join(shared_from_this()); readHeader(); } void deliver(const message& messageItem) { bool write_in_progress = !Messages.empty(); Messages.push_back(messageItem); if(!write_in_progress) { write(); } } private: void readHeader() { auto self(shared_from_this()); boost::asio::async_read(socket, boost::asio::buffer(messageItem.data(), message::headerLength), [this, self](boost::system::error_code ec, size_t) { if(!ec && messageItem.decodeHeader()) { readBody(); } else { room_.leave(shared_from_this()); } }); } void readBody() { auto self(shared_from_this()); boost::asio::async_read(socket, boost::asio::buffer(messageItem.body(), messageItem.bodyLength()), [this, self](boost::system::error_code ec, size_t) { if(!ec) { room_.deliver(messageItem); readHeader(); } else { room_.leave(shared_from_this()); } }); } void write() { auto self(shared_from_this()); boost::asio::async_write(socket, boost::asio::buffer(Messages.front().data(), Messages.front().length()), [this, self](boost::system::error_code ec, size_t) { if(!ec) { Messages.pop_front(); if(!Messages.empty()) { write(); } } else { room_.leave(shared_from_this()); } }); } tcp::socket socket; room& room_; message messageItem; messageQueue Messages; }; class server { public: server(boost::asio::io_context& io_context, const tcp::endpoint& endpoint) : acceptor(io_context, endpoint) { do_accept(); } private: void do_accept() { acceptor.async_accept([this](boost::system::error_code ec, tcp::socket socket) { if(!ec) { make_shared<session>(move(socket), room_)->start(); } do_accept(); }); } tcp::acceptor acceptor; room room_; }; int main(int argc, char* argv[]) { try { if(argc < 2) { cerr << "Usage: server <port> [<port> ...]\n"; return 1; } boost::asio::io_context io_context; list<server> servers; for(int i = 1; i < argc; ++i) { tcp::endpoint endpoint(tcp::v4(), atoi(argv[i])); servers.emplace_back(io_context, endpoint); } io_context.run(); } catch (exception& e) { cerr << "Exception: " << e.what() << "\n"; } return 0; } نرم افزار دوم و سمت کاربر : (client.cpp) #include <iostream> #include <thread> #include <cstdlib> #include <deque> #include <boost/asio.hpp> #include "message.hpp" using boost::asio::ip::tcp; using namespace std; typedef deque<message> messageQueue; class client { public: client(boost::asio::io_context& context, const tcp::resolver::results_type& endpoints) : context(context), socket(context) { connect(endpoints); } void write(const message& messageItem) { boost::asio::post(context, [this, messageItem]() { bool write_in_progress = !writeMessage.empty(); writeMessage.push_back(messageItem); if(!write_in_progress) { write(); } }); } void close() { boost::asio::post(context, [this]() { socket.close(); }); } private: void connect(const tcp::resolver::results_type& endpoints) { boost::asio::async_connect(socket, endpoints, [this](boost::system::error_code ec, tcp::endpoint) { if(!ec) { readHeader(); } }); } void readHeader() { boost::asio::async_read(socket, boost::asio::buffer(readMessage.data(), message::headerLength), [this](boost::system::error_code ec, size_t) { if(!ec && readMessage.decodeHeader()) { readBody(); } else { socket.close(); } }); } void readBody() { boost::asio::async_read(socket, boost::asio::buffer(readMessage.body(), readMessage.bodyLength()), [this](boost::system::error_code ec, size_t) { if(!ec) { cout.write(readMessage.body(), readMessage.bodyLength()); cout << "\n"; readHeader(); } else { socket.close(); } }); } void write() { boost::asio::async_write(socket, boost::asio::buffer(writeMessage.front().data(), writeMessage.front().length()), [this](boost::system::error_code ec, size_t) { if(!ec) { writeMessage.pop_front(); if(!writeMessage.empty()) { write(); } } else { socket.close(); } }); } boost::asio::io_context& context; tcp::socket socket; message readMessage; messageQueue writeMessage; }; int main(int argc, char* argv[]) { try { if(argc != 3) { cerr << "Usage: client <host> <port>\n"; return 1; } boost::asio::io_context context; tcp::resolver resolver(context); auto endpoints = resolver.resolve(argv[1], argv[2]); client c(context, endpoints); thread t([&context](){ context.run(); }); char line[message::maxBodyLength + 1]; while(cin.getline(line, message::maxBodyLength + 1)) { message messageItem; messageItem.bodyLength(strlen(line)); memcpy(messageItem.body(), line, messageItem.bodyLength()); messageItem.encodeHeader(); c.write(messageItem); } c.close(); t.join(); } catch (exception& e) { cerr << "Exception: " << e.what() << "\n"; } return 0; } این پروژه آزمایشی بصورت رایگان و اوپن سورس در اینترنت بخصوص اینجا وجود دارد و می توانید آنرا مستقیما بصورت کامل دانلود کنید. با تشکر, Max Base / مکس بیس -
نگارش 1.69.0
77 دریافت
کتابخانه Boost منبعی از کتابخانههای قابل حمل و آزاد ++C را فراهم میکند که از اصطلاح Peer-Reviewed پشتیبانی میکند. ما بر این تاکید میکنیم، Boost کتابخانه ای است که به خوبی با کتابخانه ی استاندارد ++C کار میکند. بوست مجموعه ای از کتابخانههای برنامه نویسی برای زبان برنامه نویسی سی پلاس پلاس است که پشتیبانی از کارهایی مانند جبر خطی، ساخت اعداد شبه تصادفی, ریسهبندی, پردازش تصویر, عبارت باقاعده و آزمایش واحد را ارائه میدهد. بیشتر این کتابخانه ها تحت پروانه نرم افزار بوست منتشر میشوند که به بوست اجازه میدهد هم در یک نرم افزار آزاد و هم در یک نرم آفزار انحصاری استفاده شود. بسیاری از پدید آورندگان بوست عضو کمیته استانداردسازی سی++ هستند و چند کتابخانه بوست برای الحاق به استانداردهای TR1 و C++11 پذیرفته شده اند.رایگان
-
همانطور که میدانید کتابخانهی بوست یکی از بهترین کتابخانههای Non-STL برای سیپلاسپلاس میباشد. در این پُست قصد داریم در رابطه با ساخت و استفاده کتابخانهی بوست توضیح دهیم. ابتدا کتابخانه را از اینجا دریافت کنید. فایلهای دریافتی را در یک مسیر مشخص استخراج کنید. راه اندازی در پلتفرم ویندوز برای مثال در این آموزش ما فایلهای مورد نظر خود را در مسیر C:/Boost استخراج کردهایم. در کنسول به مسیر فوق رفته و دستور زیر را اجرا کنید. bootstrap.bat این دستور تحت ابزار مخصوص بوست فایل کانفیگ ساخت آن را ارزیابی و اجرا میکند. بنابراین دستور بعدی به صورت زیر خواهد بود: b2 toolset=msvc-14.0 --build-type=complete --abbreviate-paths architecture=x86 address-model=64 install -j4 گزینهی toolset برای مشخص کردن کامپایلر و نسخهی آن میباشد که در اینجا آن را msvc-14.0 قرار داده ایم. گزینهی architecture جهت مشخص کردن معماری پردازنده است که به صورت پیش فرض بهتر است بر روی x86 تنظیم شود تا بر روی هر دو معماری ۶۴ و ۳۲ بیتی اجرا شود. گزینهی address-model جهت مشخص سازی نوع پردازندهای که پلتفرم اجرایی دارا میباشد را مشخص میسازد. برای مثال ما بر روی ویندوز ۶۴ بیتی و پردازنده ۶۴ بیتی گزینه x64 را انتخاب کرده ایم. گزینهی -j برای مشخص کردن تعداد هستههای قابل استفاده در زمان کامپایل میباشد. که به صورت پیشفرض بر روی ۴ تنظیم شده است (۴ هسته قابل اجرا به صورت هم زمان). بعد از اجرای دستور فوق چیزی حدود ۳۰ دقیقه (کمتر و یا بیشتر) متناسب با قدرت پردازشی سیستم شما نیاز خواهد بود تا کتابخانهی بوست کامپایل شود. توجه داشته باشید که بخشی از کتابخانههای موجود در بوست به صورت پیش فرض کامپایل نمیشوند و در صورت نیاز شما باید آنها را به صورت سفارشی تحت دستور --with-libraryname مشخص نمایید. کد زیر را اجرا نموده و نتیجه را مشاهده کنید: #include <boost/scoped_ptr.hpp> #include <iostream> int main() { boost::scoped_ptr<int> p{new int{1}}; std::cout << *p << '\n'; p.reset(new int{2}); std::cout << *p.get() << '\n'; p.reset(); std::cout << std::boolalpha << static_cast<bool>(p) << '\n'; } این آموزش برای پیکربندی کتابخانههای chrono, thread, filesystem, regex و...بر روی پلتفرمهای macOS و Linux ادامه خواهد داشت...
-
- بوست
- سیپلاسپلاس
- (و 10 مورد دیگر)