بک "لینکس API۔ جامع گائیڈ »


بک "لینکس API۔ جامع گائیڈ »

صبح بخیر میں آپ کی توجہ "Linux API" کتاب لاتا ہوں۔ جامع گائیڈ" (کتاب کا ترجمہ لینکس پروگرامنگ انٹرفیس)۔ اسے ناشر کی ویب سائٹ پر آرڈر کیا جا سکتا ہے، اور اگر آپ پرومو کوڈ کا اطلاق کرتے ہیں۔ LinuxAPI آپ کو 30% رعایت ملے گی۔

جائزہ کے لیے کتاب سے ایک اقتباس:

ساکٹ: سرور فن تعمیر

اس باب میں، ہم تکراری اور متوازی سرورز کو ڈیزائن کرنے کی بنیادی باتوں کے ساتھ ساتھ ایک خصوصی انیٹ ڈیمون پر بات کریں گے جو سرور کے ساتھ انٹرنیٹ ایپلی کیشنز کی تخلیق میں سہولت فراہم کرتا ہے۔

تکرار اور متوازی سرورز

دو عام ساکٹ پر مبنی نیٹ ورک سرور آرکیٹیکچرز ہیں:

  • تکراری: سرور ایک وقت میں ایک کلائنٹ کو پیش کرتا ہے، پہلے ایک کلائنٹ کی درخواست (یا متعدد درخواستوں) پر کارروائی کرتا ہے اور پھر اگلے پر منتقل ہوتا ہے۔

  • متوازی: سرور کو ایک ہی وقت میں متعدد کلائنٹس کی خدمت کے لیے ڈیزائن کیا گیا ہے۔

سیکشن 44.8 پہلے ہی FIFO قطاروں پر مبنی تکرار سرور کی مثال فراہم کر چکا ہے۔

تکرار سرور عام طور پر صرف ان حالات میں موزوں ہوتے ہیں جہاں کلائنٹ کی درخواستوں پر کافی تیزی سے کارروائی کی جاسکتی ہے، کیونکہ ہر کلائنٹ کو اس وقت تک انتظار کرنا پڑتا ہے جب تک کہ اس کے سامنے موجود کسی دوسرے کلائنٹ کی خدمت نہ ہوجائے۔ اس نقطہ نظر کے لئے ایک عام استعمال کیس ایک کلائنٹ اور سرور کے درمیان واحد درخواستوں اور جوابات کا تبادلہ کرنا ہے۔

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

مندرجہ ذیل حصوں میں، ہم انٹرنیٹ ڈومین ساکٹ پر مبنی تکراری اور متوازی سرورز کی مثالیں دیکھیں گے۔ یہ دونوں سرورز ایکو سروس (RFC 862) کا ایک آسان ورژن نافذ کرتے ہیں جو کلائنٹ کے ذریعے بھیجے گئے کسی بھی پیغام کی کاپی واپس کرتا ہے۔

echo iteration udp سرور

اس اور اگلے حصے میں، ہم ایکو سروس کے لیے سرور متعارف کرائیں گے۔ یہ پورٹ نمبر 7 پر دستیاب ہے اور UDP اور TCP دونوں پر کام کرتا ہے (یہ پورٹ محفوظ ہے، اور اس لیے ایکو سرور کو ایڈمنسٹریٹر کی مراعات کے ساتھ چلایا جانا چاہیے)۔

ایکو یو ڈی پی سرور ڈیٹا گرام کو مسلسل پڑھتا ہے اور ان کی ایک کاپی بھیجنے والے کو واپس کرتا ہے۔ چونکہ سرور کو ایک وقت میں صرف ایک پیغام پر کارروائی کرنے کی ضرورت ہوتی ہے، اس لیے یہاں ایک تکراری فن تعمیر کافی ہوگا۔ سرورز کے لیے ہیڈر فائل فہرست 56.1-XNUMX میں دکھائی گئی ہے۔

فہرست سازی 56.1. پروگراموں کے لیے ہیڈر فائل id_echo_sv.c اور id_echo_cl.c

#include "inet_sockets.h" /* ہمارے ساکٹ کے افعال کا اعلان کرتا ہے */
# "tlpi_hdr.h" شامل کریں

#SERVICE کی وضاحت کریں "echo" /* UDP سروس کا نام */

#define BUF_SIZE 500 /* ڈیٹا گرام کا زیادہ سے زیادہ سائز جو
کلائنٹ اور سرور کے ذریعہ پڑھا جا سکتا ہے */
________________________________________________________________________ ساکٹ/id_echo.h

56.2-XNUMX کی فہرست سرور کے نفاذ کو ظاہر کرتی ہے۔ یہ مندرجہ ذیل نکات پر توجہ دینے کے قابل ہے:

  • سرور کو ڈیمون موڈ میں ڈالنے کے لیے، ہم سیکشن 37.2 سے becomeDaemon() فنکشن استعمال کرتے ہیں۔

  • پروگرام کو مزید کمپیکٹ بنانے کے لیے، ہم سیکشن 55.12 میں تیار کردہ انٹرنیٹ ڈومین ساکٹ لائبریری کا استعمال کرتے ہیں۔

  • اگر سرور کلائنٹ کو جواب نہیں دے سکتا، تو یہ syslog() کال کا استعمال کرتے ہوئے لاگ کو پیغام لکھتا ہے۔

ایک حقیقی ایپلی کیشن میں، ہم غالباً syslog() کا استعمال کرتے ہوئے پیغامات کو لاگ کرنے کی فریکوئنسی پر ایک خاص حد لگائیں گے۔ اس سے حملہ آور کے سسٹم لاگ کو اوور فلو کرنے کا امکان ختم ہو جائے گا۔ یہ بھی ذہن میں رکھیں کہ ہر syslog() کال کافی مہنگی ہوتی ہے، کیونکہ یہ fsync() بطور ڈیفالٹ استعمال کرتی ہے۔

فہرست سازی 56.2. ایک تکراری سرور جو ایکو UDP سروس کو نافذ کرتا ہے۔

_____________________________________________________________________ ساکٹ/id_echo_sv.c
#شامل
# "id_echo.h" شامل کریں
# شامل کریں "become_daemon.h"

int
مین (int argc، char *argv[])
{
int sfd;
size_t numRead;
socklen_tlen
struct sockaddr_storage claddr;
چاربف[BUF_SIZE]؛
char addrStr[IS_ADDR_STR_LEN]؛

اگر (بن جائے ڈیمون (0) == -1)
errExit("becomeDaemon")؛

sfd = inetBind(SERVICE، SOCK_DGRAM، NULL)؛
اگر (sfd == -1) {
syslog(LOG_ERR، "سرور ساکٹ نہیں بنا سکا (%s)"،
strerror(errno))؛
باہر نکلیں(EXIT_FAILURE)؛

/* ڈیٹا گرام وصول کریں اور بھیجنے والوں کو کاپیاں واپس کریں*/
}
کے لیے(;;) {
len = sizeof(struct sockaddr_storage)؛
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

اگر (numRead == -1)
errExit("recvfrom")؛
اگر (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!=numRead)
syslog(LOG_WARNING، "%s (%s) کے جواب کی بازگشت میں خرابی"،
inetAddressStr((struct sockaddr*) &claddr, len,
addrStr, IS_ADDR_STR_LEN)،
strerror(errno))؛
}
}
_____________________________________________________________________ ساکٹ/id_echo_sv.c

ہم سرور کو جانچنے کے لیے 56.3 کی فہرست میں پروگرام کا استعمال کرتے ہیں۔ یہ سیکشن 55.12 میں تیار کردہ انٹرنیٹ ڈومین ساکٹ لائبریری کا بھی استعمال کرتا ہے۔ کلائنٹ پروگرام نیٹ ورک ہوسٹ کا نام لیتا ہے جہاں سرور کمانڈ لائن پر پہلی دلیل کے طور پر واقع ہے۔ کلائنٹ ایک لوپ میں داخل ہوتا ہے جہاں وہ ہر بقیہ دلائل کو الگ ڈیٹا گرام کے طور پر سرور کو بھیجتا ہے، اور پھر جواب میں سرور سے موصول ہونے والے ڈیٹا گرام کو پڑھتا اور آؤٹ پٹ کرتا ہے۔

فہرست سازی 56.3. ایکو UDP سروس کے لیے کلائنٹ

# "id_echo.h" شامل کریں

int
مین (int argc، char *argv[])
{
int sfd,j;
size_tlen;
size_t numRead;
چاربف[BUF_SIZE]؛

اگر (argc <2 || strcmp(argv[1], "--help") == 0)
usageErr("%s host msg…n", argv[0]);

/* پہلی کمانڈ لائن دلیل کی بنیاد پر سرور ایڈریس بنائیں */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM)؛
اگر (sfd == -1)
مہلک ("سرور ساکٹ سے منسلک نہیں ہو سکا")؛

/* بقیہ دلائل سرور کو علیحدہ ڈیٹا گرام کے طور پر بھیجیں*/
کے لیے (j = 2؛ j <argc؛ j++) {
len = strlen(argv[j])؛
اگر (لکھیں(sfd, argv[j], len) != len)
مہلک ("جزوی/ناکام تحریر")؛

numRead = پڑھیں(sfd, buf, BUF_SIZE)؛
اگر (numRead == -1)
errExit("پڑھیں")؛
printf("[%ld بائٹس] %.*sn"، (لمبی) numRead، (int) numRead، buf)؛
}
باہر نکلیں(EXIT_SUCCESS)؛
}
_____________________________________________________________________ ساکٹ/id_echo_cl.c

مندرجہ ذیل ایک مثال ہے جو ہم دیکھیں گے جب ہم سرور شروع کریں گے اور دو کلائنٹ مثالیں:

$su // ایک محفوظ بندرگاہ سے منسلک ہونے کے لیے مراعات کی ضرورت ہے۔
پاس ورڈ:
# ./id_echo_sv // سرور پس منظر میں چلا جاتا ہے۔
# باہر نکلیں // منتظم کے حقوق سے دستبردار ہوں۔
$ ./id_echo_cl localhost ہیلو ورلڈ // یہ کلائنٹ دو ڈیٹا گرام بھیجتا ہے۔
[5 بائٹس] ہیلو // کلائنٹ سرور سے موصول ہونے والے جواب کو آؤٹ پٹ کرتا ہے۔
[5 بائٹس] دنیا
$ ./id_echo_cl localhost الوداع // یہ کلائنٹ ایک ڈیٹا گرام بھیجتا ہے۔
[7 بائٹس] الوداع

میں آپ کو ایک خوشگوار پڑھنے کی خواہش کرتا ہوں)

ماخذ: linux.org.ru