ڪتاب "لينڪس API. جامع ھدايت »


ڪتاب "لينڪس API. جامع ھدايت »

منجهند جو سلام مان توهان جي ڌيان ڏانهن آڻيان ٿو ڪتاب ”لينڪس API. جامع ھدايت "(ڪتاب جو ترجمو لينڪس پروگرامنگ انٽرفيس). اهو حڪم ڪري سگهجي ٿو پبلشر جي ويب سائيٽ تي، ۽ جيڪڏهن توهان لاڳو ڪريو پرومو ڪوڊ LinuxAPI توهان کي 30٪ رعايت ملندي.

نظرثاني لاءِ ڪتاب مان هڪ اقتباس:

ساکٽ: سرور آرڪيٽيڪچر

هن باب ۾، اسين بنيادي ڳالهين تي بحث ڪنداسين تکراري ۽ متوازي سرورز کي ڊزائين ڪرڻ، انهي سان گڏ هڪ خاص انٽيڊ ڊيمون جيڪو سرور جي طرف انٽرنيٽ ايپليڪيشنن جي تخليق کي آسان بڻائي ٿو.

ورجائي ۽ متوازي سرور

هتي ٻه عام ساکٽ تي ٻڌل نيٽورڪ سرور آرڪيٽيڪچر آهن:

  • ورجائي: سرور هڪ وقت ۾ هڪ ڪلائنٽ جي خدمت ڪندو آهي، پهرين هڪ درخواست (يا ڪيترن ئي درخواستن) کي پروسيس ڪري رهيو آهي هڪ ڪلائنٽ کان ۽ پوء اڳتي وڌڻ تي؛

  • متوازي: سرور هڪ ئي وقت ڪيترن ئي گراهڪن جي خدمت ڪرڻ لاء ٺهيل آهي.

سيڪشن 44.8 اڳ ۾ ئي FIFO قطارن جي بنياد تي هڪ iteration سرور جو مثال مهيا ڪري چڪو آهي.

Iteration سرور عام طور تي صرف انهن حالتن ۾ مناسب هوندا آهن جتي ڪلائنٽ جي درخواستن تي عمل ڪري سگهجي ٿو تڪڙو تڪڙو، جيئن هر ڪلائنٽ کي انتظار ڪرڻو پوندو جيستائين ان جي سامهون ڪنهن ٻئي ڪلائنٽ جي خدمت نه ڪئي وڃي. هن طريقي لاءِ هڪ عام استعمال ڪيس هڪ ڪلائنٽ ۽ سرور جي وچ ۾ واحد درخواستن ۽ جوابن کي مٽائڻ آهي.

متوازي سرور انهن ڪيسن ۾ مناسب آهن جتي هر درخواست تي عمل ڪرڻ ۾ هڪ اهم وقت لڳندو آهي، يا ڪلائنٽ ۽ سرور ۾ پيغامن جي ڊگهي مٽاسٽا هوندي آهي. هن باب ۾، اسان بنيادي طور تي متوازي سرورز کي ڊزائين ڪرڻ جي روايتي (۽ آسان ترين) طريقي تي ڌيان ڏينداسين، جيڪو هر نئين ڪلائنٽ لاءِ هڪ الڳ ٻاراڻو عمل ٺاهڻ آهي. اهڙو عمل ڪلائنٽ جي خدمت جو سمورو ڪم ڪري ٿو، جنهن کان پوءِ ختم ٿي وڃي ٿو. جيئن ته انهن عملن مان هر هڪ آزاد طور تي هلندي آهي، اهو ممڪن آهي ته هڪ ئي وقت ڪيترن ئي گراهڪن جي خدمت ڪرڻ. مکيه سرور جي عمل جو بنيادي ڪم (والدين) هر نئين ڪلائنٽ لاء هڪ الڳ ٻار پيدا ڪرڻ آهي (متبادل طور تي، پروسيس جي بدران، توهان ٺاهي سگهو ٿا عملدرآمد جا موضوع).

ھيٺين حصن ۾، اسين انٽرنيٽ ڊومين ساکٽس جي بنياد تي تکراري ۽ متوازي سرورز جا مثال ڏسندا. اهي ٻه سرورز ايڪو سروس (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"

# define SERVICE "echo" /* UDP سروس جو نالو */

#define BUF_SIZE 500 /* ڊيٽاگرام جي وڌ ۾ وڌ سائيز جيڪا
ڪلائنٽ ۽ سرور طرفان پڙهي سگھجي ٿو */
__________________________________________________________________ ساکٽس/id_echo.h

لسٽنگ 56.2-XNUMX سرور تي عمل درآمد ڏيکاري ٿي. اهو هيٺين نقطن تي ڌيان ڏيڻ جي قابل آهي:

  • سرور کي ڊيمون موڊ ۾ رکڻ لاءِ، اسان سيڪشن 37.2 مان becomeDaemon() فنڪشن استعمال ڪندا آهيون؛

  • پروگرام کي وڌيڪ ٺهڪندڙ بڻائڻ لاءِ، اسان استعمال ڪريون ٿا انٽرنيٽ ڊومين ساڪٽ لائبريري سيڪشن 55.12 ۾ تيار ڪيل؛

  • جيڪڏهن سرور ڪلائنٽ کي جواب نه ڏئي سگهي، اهو syslog() ڪال استعمال ڪندي لاگ ڏانهن پيغام لکي ٿو.

هڪ حقيقي ايپليڪيشن ۾، اسان گهڻو ڪري syslog() استعمال ڪندي پيغامن جي لاگنگ جي تعدد تي هڪ خاص حد لاڳو ڪنداسين. اهو هڪ حملي آور جي امڪان کي ختم ڪري ڇڏيندو سسٽم لاگ کي ختم ڪري ڇڏيندو. اهو پڻ ذهن ۾ رکو ته هر syslog() ڪال ڪافي مهانگو آهي، ڇاڪاڻ ته اهو fsync() ڊفالٽ طور استعمال ڪري ٿو.

لسٽنگ 56.2. هڪ ٻيهر سرور جيڪو ايڪو يو ڊي پي سروس کي لاڳو ڪري ٿو

_____________________________________________________________________ ساکٽس/id_echo_sv.c
#شامل
#شامل "id_echo.h"
#شامل "become_daemon.h"

int
مکيه (int argc، char *argv[])
{
int sfd؛
ssize_t numRead؛
socklen_tlen ؛
struct sockaddr_storage claddr؛
charbuf[BUF_SIZE]؛
char addrStr[IS_ADDR_STR_LEN]؛

جيڪڏهن (بنجي ڊيمون (0) == -1)
errExit("becomeDaemon")؛

sfd = inetBind (سروس، SOCK_DGRAM، NULL)؛
جيڪڏهن (sfd == -1) {
syslog(LOG_ERR, "سرور ساکٽ ٺاهي نه سگهيو (%s)",
غلطي (غلطي)؛
نڪرڻ (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)
!= num پڙهو)
syslog(LOG_WARNING, "%s (%s) جي جواب جي گونج ۾ غلطي",
inetAddressStr((struct sockaddr*) &claddr,len,
addrStr, IS_ADDR_STR_LEN)،
غلطي (غلطي)؛
}
}
_____________________________________________________________________ ساکٽس/id_echo_sv.c

اسان پروگرام استعمال ڪريون ٿا لسٽنگ 56.3 ۾ سرور کي جانچڻ لاءِ. اهو سيڪشن 55.12 ۾ ٺاهيل انٽرنيٽ ڊومين ساکٽ لائبريري پڻ استعمال ڪري ٿو. ڪلائنٽ پروگرام نيٽ ورڪ ميزبان جو نالو وٺي ٿو جتي سرور ڪمان لائن تي پهرين دليل جي طور تي واقع آهي. ڪلائنٽ هڪ لوپ ۾ داخل ٿئي ٿو جتي اهو هر هڪ باقي دليلن کي سرور ڏانهن الڳ الڳ ڊيٽاگرام طور موڪلي ٿو، ۽ پوء جواب ۾ سرور کان حاصل ڪيل ڊيٽاگرام پڙهي ۽ ڪڍي ٿو.

لسٽنگ 56.3. گونج UDP خدمت لاءِ ڪلائنٽ

#شامل "id_echo.h"

int
مکيه (int argc، char *argv[])
{
int sfd,j;
size_tlen ؛
ssize_t numRead؛
charbuf[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 bytes] %.*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