شبکه
شبکه در سیپلاسپلاس به فرآیند طراحی و پیادهسازی برنامههایی اشاره دارد که قادر به ارتباط بین کامپیوترها و دستگاهها در یک شبکه هستند. شبکه در توسعه نرمافزار اهمیت بالایی دارد زیرا بسیاری از سیستمهای مدرن، مانند برنامههای سرویسگیرنده-سرویسدهنده، سیستمهای توزیعشده و خدمات زمان واقعی، به ارتباط مطمئن و بهینه نیاز دارند.
در سیپلاسپلاس، برنامهنویسی شبکه معمولاً شامل استفاده از sockets برای TCP/UDP، پروتکلهای ارتباطی، و مکانیزمهای چندنخی (multithreading) برای مدیریت اتصالات همزمان میشود. مفاهیم کلیدی سیپلاسپلاس مانند سینتکس دقیق، ساختارهای داده برای مدیریت بافرها، الگوریتمهای بهینه برای پردازش پیامها و اصول برنامهنویسی شیگرا (OOP) برای کپسولهسازی منطق شبکه، پایهای برای توسعه برنامههای شبکهای پایدار هستند.
در این آموزش، خواننده یاد میگیرد که چگونه یک سرور TCP ساده بسازد، اتصالات مشتریان را بپذیرد، پیام ارسال و دریافت کند و مدیریت خطاهای مناسب را اعمال نماید. همچنین به بهترین شیوهها برای جلوگیری از نشت حافظه، بهینهسازی عملکرد و امنیت دادهها پرداخته میشود. پس از مطالعه این آموزش، توسعهدهندگان قادر خواهند بود ویژگیهای شبکه را در پروژههای پیچیده سیپلاسپلاس ادغام کرده و نقش شبکه را در معماری سیستمهای نرمافزاری مدرن درک کنند.
مثال پایه
text\#include <iostream>
\#include <cstring>
\#include \<sys/types.h>
\#include \<sys/socket.h>
\#include \<netinet/in.h>
\#include \<unistd.h>
int main() {
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
std::cerr << "خطا در ایجاد socket" << std::endl;
return 1;
}
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(8080);
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) {
std::cerr << "خطا در bind" << std::endl;
close(serverSocket);
return 1;
}
if (listen(serverSocket, 5) < 0) {
std::cerr << "خطا در listen" << std::endl;
close(serverSocket);
return 1;
}
std::cout << "سرور روی پورت 8080 فعال است..." << std::endl;
int clientSocket = accept(serverSocket, nullptr, nullptr);
if (clientSocket < 0) {
std::cerr << "خطا در accept" << std::endl;
close(serverSocket);
return 1;
}
const char* message = "سلام از سرور سیپلاسپلاس!\n";
send(clientSocket, message, std::strlen(message), 0);
close(clientSocket);
close(serverSocket);
return 0;
}
در این مثال، یک سرور TCP ساده ایجاد میشود. تابع socket() برای ایجاد socket استفاده میشود، bind() آن را به یک آدرس IP و پورت متصل میکند، listen() سرور را آماده پذیرش اتصال میکند و accept() اتصال مشتری را میپذیرد و یک socket جدید برای ارتباط فراهم میکند. تابع send() دادهها را به مشتری ارسال میکند و close() برای آزادسازی منابع استفاده میشود.
این مثال بهترین شیوههای سیپلاسپلاس مانند بررسی مقادیر بازگشتی توابع، استفاده از const برای پیامها و مدیریت منابع برای جلوگیری از نشت حافظه را نشان میدهد. همچنین مفاهیم بنیادی شبکه از جمله ارتباط نقطه به نقطه، پردازش پیامها و مقداردهی ایمن به ساختارهای داده را به خوبی نمایش میدهد.
مثال کاربردی
text\#include <iostream>
\#include <thread>
\#include <vector>
\#include <cstring>
\#include \<sys/types.h>
\#include \<sys/socket.h>
\#include \<netinet/in.h>
\#include \<unistd.h>
void handleClient(int clientSocket) {
char buffer\[1024];
std::memset(buffer, 0, sizeof(buffer));
ssize_t bytesRead = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);
if (bytesRead > 0) {
std::cout << "پیام دریافت شد: " << buffer << std::endl;
const char* response = "پیام دریافت شد\n";
send(clientSocket, response, std::strlen(response), 0);
}
close(clientSocket);
}
int main() {
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) return 1;
sockaddr_in serverAddr{};
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = INADDR_ANY;
serverAddr.sin_port = htons(8080);
if (bind(serverSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) < 0) return 1;
if (listen(serverSocket, 5) < 0) return 1;
std::vector<std::thread> threads;
while (true) {
int clientSocket = accept(serverSocket, nullptr, nullptr);
if (clientSocket >= 0) {
threads.emplace_back(std::thread(handleClient, clientSocket));
}
}
for (auto& t : threads) t.join();
close(serverSocket);
return 0;
}
این مثال پیشرفتهتر یک سرور TCP چندنخی را نشان میدهد که میتواند همزمان چندین مشتری را مدیریت کند. هر اتصال در یک thread جداگانه پردازش میشود. تابع recv() پیامها را به شکل امن دریافت میکند و از overflow بافر جلوگیری میشود. استفاده از std::vector برای مدیریت threadها، کنترل چرخه عمر آنها را ممکن میکند و join() تضمین میکند که همه threadها قبل از خاموش کردن سرور خاتمه یابند. این مثال اصول RAII، چندنخی و بهترین شیوههای کتابخانه استاندارد سیپلاسپلاس را نشان میدهد.
بهترین شیوهها در سیپلاسپلاس برای شبکه شامل بررسی مقادیر بازگشتی توابع، مدیریت منابع با RAII، اجتناب از فراخوانیهای بلاککننده و مدیریت صحیح خطاها است. اشتباهات رایج شامل نشت حافظه، عدم بررسی خطاها و الگوریتمهای ناکارآمد هستند. برای دیباگ، استفاده از logging دقیق، ابزارهایی مانند Valgrind و بررسی کدهای خطا توصیه میشود. بهینهسازی شامل استفاده مجدد از بافرها، پردازش دستهای و استفاده از sockets غیرمسدودکننده است. امنیت نیز با اعتبارسنجی دادهها، جلوگیری از overflow و استفاده از پروتکلهای امن مانند SSL/TLS تامین میشود.
📊 جدول مرجع
سیپلاسپلاس Element/Concept | Description | Usage Example |
---|---|---|
Socket | نقطه انتهایی ارتباط شبکه | int sock = socket(AF_INET, SOCK_STREAM, 0); |
Bind | متصل کردن socket به IP و پورت | bind(sock, (struct sockaddr*)\&addr, sizeof(addr)); |
Listen | قرار دادن socket در حالت شنود | listen(sock, 5); |
Accept | پذیرش اتصال مشتری | int client = accept(sock, nullptr, nullptr); |
Send/Recv | ارسال و دریافت دادهها | send(client, msg, strlen(msg), 0); recv(client, buffer, 1024, 0); |
Threads | مدیریت چند مشتری به صورت همزمان | std::thread t(handleClient, client); |
یادگیری شبکه در سیپلاسپلاس به توسعهدهندگان امکان ایجاد برنامههای سرویسگیرنده-سرویسدهنده، سیستمهای توزیعشده و سرویسهای زمان واقعی را میدهد. دانش TCP/UDP، چندنخی، مدیریت بافر دادهها و مدیریت خطا، پایهای برای پروژههای پیچیده است.
گامهای بعدی شامل استفاده از Boost.Asio، SSL/TLS، ساختارهای داده پیشرفته برای شبکه و توسعه پروژههای عملی مانند چتها، سرورهای HTTP و برنامههای توزیعشده برای تثبیت مهارتها است.
🧠 دانش خود را بیازمایید
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود