C++ میں ساکٹ پروگرامنگ

C My Sak Prwgramng



کمپیوٹر نیٹ ورکنگ کے میدان میں ساکٹ پروگرامنگ ایک اہم موضوع بن گیا ہے۔ اس میں بغیر کسی رکاوٹ کے ایک دوسرے کے ساتھ بات چیت کرنے کے لیے دو نوڈس، سرور اور کلائنٹ کے درمیان رابطہ قائم کرنا شامل ہے۔ سرور مواصلاتی چینل میں سننے والے کے طور پر کام کرتا ہے اور IP ایڈریس پر مخصوص پورٹ پر کلائنٹ کو سنتا ہے۔ دوسری طرف، موکل مواصلاتی چینل میں ایک کمیونیکیٹر کے طور پر کام کرتا ہے۔ کلائنٹ کنکشن بنانے اور سرور سے رابطہ کرنے کے لیے سرور سے رابطہ کرتا ہے۔ اس مضمون کا مقصد C++ میں ساکٹ پروگرامنگ کے لیے ایک جامع اور مفصل گائیڈ فراہم کرنا، بنیادی باتوں کا احاطہ کرنا، عملی مثالیں پیش کرنا، اور کوڈ کی تفصیلی وضاحت فراہم کرنا ہے۔

کلائنٹ-سرور ماڈل قائم کرنا

ساکٹ پروگرامنگ وہ عمل ہے جو ساکٹ کا استعمال کرتے ہوئے سرور اور کلائنٹ کے درمیان ایک مواصلاتی چینل بناتا ہے۔ مندرجہ ذیل مثال کے کوڈ میں، کلائنٹ سرور کے ساتھ رابطہ شروع کرتا ہے، اور سرور کلائنٹ کے کنکشن کو قبول کرنے کے لیے ترتیب دیا جاتا ہے۔ آئیے نیٹ ورک کمیونیکیشن میں سرور اور کلائنٹ کوڈ کے حصوں کو ان کے بنیادی کام کا مظاہرہ کرتے ہوئے سمجھیں۔ درج ذیل سرور سائیڈ کوڈ ہے۔ آئیے پہلے کوڈ کو دیکھتے ہیں اور پھر کوڈ کو تفصیل سے بیان کرتے ہیں، پوائنٹ بہ پوائنٹ۔

1. سرور سائیڈ







ماڈل کے سرور سائیڈ کا کوڈ درج ذیل میں دیا گیا ہے۔ آئیے دیکھتے ہیں کہ کوڈ میں کیا ہو رہا ہے:



# شامل کریں
#include
#include
#include

استعمال کرتے ہوئے نام کی جگہ std ;

#پورٹ 8080 کی وضاحت کریں۔
# MAX_BUF_SIZE 1024 کی وضاحت کریں۔

int مرکزی ( ) {
int ser_socket، cli_socket ;
ساخت sockaddr_in ser_address، cli_address ;
چار buf [ MAX_BUF_SIZE ] = { 0 } ;

اگر ( ( ser_socket = ساکٹ ( AF_INET، SOCK_STREAM، 0 ) ) == - 1 ) {
غلطی ( 'ساکٹ کی تخلیق میں خرابی' ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}

ser_address گناہ_خاندان = OF_INET ;
ser_address sin_addr . s_addr = INADDR_ANY ;
ser_address sin_port = htons ( پورٹ ) ;

اگر ( باندھنا ( بی_ساکٹ، ( ساخت sockaddr * ) اور ser_address, کا سائز ( ser_address ) ) == - 1 ) {
غلطی ( 'پابندی میں ناکامی' ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}

اگر ( سنو ( بی_ساکٹ، 3 ) == - 1 ) {
غلطی ( 'سننے میں ناکام' ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}

cout << 'پورٹ پر سرور سن رہا ہے' << پورٹ << '... \n ' ;

socklen_t cli_address_len = کا سائز ( cli_address ) ;
اگر ( ( cli_socket = قبول کریں ( بی_ساکٹ، ( ساخت sockaddr * ) اور cli_address، اور cli_address_len ) ) == - 1 ) {
غلطی ( 'قبول کرنے میں ناکام' ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}

پڑھیں ( cli_socket, buf, MAX_BUF_SIZE ) ;
cout << 'کلائنٹ کا پیغام ہے:' << buf << endl ;

بھیجیں ( cli_ساکٹ، 'سرور کا پیغام' ، strlen ( 'سرور کا پیغام' ) ، 0 ) ;

بند کریں ( cli_socket ) ;
بند کریں ( ser_socket ) ;

واپسی 0 ;
}

دی گئی مثال C++ پروگرام کا سرور سائیڈ کوڈ ہے۔ یہ کوڈ کسی ایک مخصوص پورٹ پر کنکشن سننے کے لیے ایک سادہ TCP سرور کے لیے کام کرتا ہے۔ جب ایک کنکشن کامیابی سے بن جاتا ہے، سرور کو ایک پیغام موصول ہوگا جو کلائنٹ کی طرف سے بھیجا گیا ہے۔ اس کے بعد، یہ اسے کنسول پر پرنٹ کرتا ہے اور کلائنٹ کو جوابی پیغام بھیجتا ہے۔ آئیے کوڈ کی ہر لائن کو سمجھیں۔



پروگرام لائبریریوں کو شامل کرنے کے ساتھ شروع ہوتا ہے: معیاری ان پٹ/آؤٹ پٹ تعریفوں کے لیے 'iostream'، سٹرنگ ہینڈلنگ فنکشنز کے لیے 'cstring'، POSIX آپریٹنگ سسٹم API تک رسائی فراہم کرنے کے لیے 'unistd.h'، اور 'arpa/inet.h' انٹرنیٹ آپریشنز کو انجام دیں۔ '# ڈیفائن پورٹ 8080' بیان کا مطلب ہے کہ یہ پورٹ نمبر 8080 کی وضاحت کرتا ہے جس پر سرور سنے گا۔ '#define MAX_BUF_SIZE 1024' کا مطلب ہے آنے والے ڈیٹا کے لیے زیادہ سے زیادہ بفر سائز جو کہ 1024 ہے۔





مین فنکشن میں، سرور اور کلائنٹ دونوں کی نمائندگی کے لیے بالترتیب دو متغیرات شروع کیے گئے ہیں، 'ser_socket' اور 'cli_socket'۔ دیگر تین متغیرات جو کہ 'sockaddr_in'، 'ser_address' اور 'cli_address' قسم کی 'struct' ہیں سرور اور کلائنٹ کے ایڈریس ڈھانچے کے طور پر شروع کیے گئے ہیں۔ اس کے بعد، 'بف' کے نام سے ایک بفر شروع کیا جاتا ہے جو کلائنٹ سے آنے والے ڈیٹا کو اسٹور کرتا ہے۔

'اگر' حالت میں ساکٹ() فنکشن ایک نیا TCP ساکٹ بناتا ہے۔ AF_INET IPv4 کو ظاہر کرتا ہے، SOCK_STREAM کنکشن پر مبنی اور قابل اعتماد TCP ساکٹ کی نمائندگی کرتا ہے، آخری دلیل جو 0 ہے ڈیفالٹ TCP پروٹوکول کو منتخب کرنے کے لیے دی جاتی ہے، INADDR_ANY کسی بھی IP ایڈریس پر کنکشن قبول کرتا ہے، اور htons (PORT) پورٹ نمبر کو تبدیل کرتا ہے۔ نیٹ ورک بائٹ آرڈر پر میزبان بائٹ آرڈر۔



چونکہ ہر چیز کی صحیح وضاحت کی گئی ہے، اس لیے اگلا مرحلہ سرور کو دی گئی پورٹ پر لسٹر کے طور پر ترتیب دینا اور کسی بھی نیٹ ورک انٹرفیس پر کنکشن قبول کرنا ہے۔ ساکٹ بائنڈ() طریقہ کے ذریعہ 'ser_address' میں معلومات کے ساتھ دیا گیا ہے۔ ہم ایک غلطی پرنٹ کرتے ہیں اور بائنڈنگ ناکام ہونے کی صورت میں عمل کو ختم کر دیتے ہیں۔ قبول () فنکشن کلائنٹ کے ساتھ کنکشن کے لیے ایک نیا ساکٹ کھولتا ہے، جب کہ listen() فنکشن سرور کو آنے والے کنکشن کا انتظار کرنے کی ہدایت کرتا ہے۔ اگر قبول () فنکشن ناکام ہوجاتا ہے تو، غلطی کا پیغام پرنٹ ہوجاتا ہے اور فنکشن سے باہر نکل جائے گا.

اگلا، سرور کلائنٹ کے پیغام کو read() فنکشن کے ساتھ 'بف' بفر میں پڑھتا ہے اور پھر اسے کنسول پر پرنٹ کرتا ہے۔ send() فنکشن سرور کے ذریعے کلائنٹ کے جواب میں پیغام بھیجنے کے لیے استعمال کیا جاتا ہے۔ آخر میں، close() کا استعمال کرتے ہوئے، سرور کلائنٹ کے ساکٹ کو بند کر دیتا ہے، پروگرام کو ختم کرتا ہے تاکہ تمام کنکشن ٹھیک طرح سے بند ہو جائیں اور ڈیٹا کی خلاف ورزی کا کوئی امکان نہ ہو۔

2. کلائنٹ سائیڈ

اب، دیکھتے ہیں کہ کلائنٹ ماڈل میں کیا ہوتا ہے:

# شامل کریں
#include
#include
#include

#پورٹ 8080 کی وضاحت کریں۔
#SERVER_IP کی وضاحت کریں '127.0.0.1'

int مرکزی ( ) {
int cli_socket ;
ساخت sockaddr_in ser_address ;
const چار * پیغام = 'کلائنٹ سلام بھیج رہا ہے!' ;

اگر ( ( cli_socket = ساکٹ ( AF_INET، SOCK_STREAM، 0 ) ) == - 1 ) {
غلطی ( 'ساکٹ بنانے میں خرابی' ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}

ser_address گناہ_خاندان = OF_INET ;
ser_address sin_port = htons ( پورٹ ) ;

اگر ( inet_pton ( AF_INET، SERVER_IP، اور ser_address sin_addr ) <= 0 ) {
غلطی ( 'غلط پتہ' ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}

اگر ( جڑیں ( cli_ساکٹ، ( ساخت sockaddr * ) اور ser_address, کا سائز ( ser_address ) ) == - 1 ) {
غلطی ( 'کنکشن کی ناکامی' ) ;
باہر نکلیں ( EXIT_FAILURE ) ;
}
بھیجیں ( cli_socket, mesg, strlen ( پیغام ) ، 0 ) ;

چار buf [ 1024 ] = { 0 } ;
پڑھیں ( cli_socket, buf, کا سائز ( buf ) ) ;
std :: cout << 'سرور کا جواب:' << buf << std :: endl ;

بند کریں ( cli_socket ) ;
واپسی 0 ;
}

آئیے یہ سمجھنے کے لیے کوڈ کی ہر سطر کو دیکھتے ہیں کہ پروگرام کیسے کام کرتا ہے۔

وہی چار لائبریریاں - iostream، cstring، unistd.h، اور arpa/inet.h - بھی کلائنٹ کی طرف شامل ہیں۔ مقامی میزبان 127.0.0.1 کے IP ایڈریس کے ساتھ ایک پورٹ نمبر بھی بیان کیا گیا ہے۔ جو پیغام سرور پر پہنچانا ہوتا ہے وہ دیا جاتا ہے۔ کلائنٹ اور سرور کو مندرجہ ذیل قدم کے طور پر کنکشن قائم کرنے کی ضرورت ہے:

'اگر ((کلائنٹ_ساکٹ = ساکٹ(AF_INET, SOCK_STREAM, 0)) == -1);' سٹریم کی قسم اور ڈیفالٹ پروٹوکول TCP کے ساتھ IPv4 کے لیے ایک ساکٹ بناتا ہے۔ اگر ساکٹ () فنکشن کنکشن قائم کرنے میں ناکام ہو جاتا ہے اور پروگرام سے باہر ہو جاتا ہے تو perror() غلطی کی تفصیلات پرنٹ کرتا ہے۔

'server_address.sin_port = htons(PORT);' نیٹ ورک بائٹ آرڈر میں تبدیل کرنے کے بعد پورٹ نمبر سیٹ کرتا ہے۔ اس کے بعد، ایک اور ناکامی کا پیغام جو کہ 'غلط ایڈریس' ہے یہاں دیا جاتا ہے جو ایڈریس میں کچھ غلط ہونے کی صورت میں پرنٹ کیا جاتا ہے۔ ایڈریس کو 'ser_address' میں تلاش کرنے سے، کلائنٹ سرور سے جڑ جائے گا۔ اگر کنکشن ناکام ہوجاتا ہے، تو غلطی کی تفصیلات پرنٹ ہوجاتی ہیں۔ send() فنکشن پیغام کو سرور پر منتقل کرے گا، اس بات کو یقینی بناتے ہوئے کہ اس میں کوئی جھنڈا نہ ہو۔

سرور سے جواب وصول کرنے اور ذخیرہ کرنے کے لیے، 'char' قسم کا 'buf' نامی بفر شروع کیا جاتا ہے۔ read() فنکشن سرور کے جواب کو بفر میں پڑھتا ہے۔ آخر میں، سرور کا جواب کنسول پر پرنٹ کیا جاتا ہے۔ آخر میں، ساکٹ کو ختم کرنے کے لیے close() بیان کا استعمال کرتے ہوئے کنکشن بند کر دیا جاتا ہے۔ پروگرام کا آؤٹ پٹ درج ذیل ہے:

نتیجہ

ساکٹ پروگرامنگ کمپیوٹر سائنس میں نیٹ ورک کمیونیکیشن کا ایک اہم حصہ ہے۔ یہ ایپلی کیشنز کی ترقی کو قابل بناتا ہے جو نیٹ ورک پر بات چیت کر سکتے ہیں، سادہ کلائنٹ-سرور آرکیٹیکچرز سے لے کر ساختی تقسیم شدہ نظاموں تک وسیع امکانات کو قابل بناتا ہے۔ جب پروگرامنگ سیاق و سباق میں ساکٹ بنایا جاتا ہے، تو پروگرام کو اپنی اختتامی خصوصیات جیسے پروٹوکول، TCP یا UDP، اور نیٹ ورک ایڈریس جیسے IP ایڈریس اور پورٹ نمبر کو ترتیب دینا چاہیے۔ یہ ساکٹ سرورز کو ڈیٹا بھیجنے اور وصول کرنے دیتے ہیں۔ یہ مضمون ایک عملی مثال کو ظاہر کرتا ہے کہ ساکٹ پروگرامنگ میں کلائنٹ سرور ماڈل کیسے کام کرتا ہے۔