کتاب "لینکس API. جامع لارښود »


کتاب "لینکس API. جامع لارښود »

بعد له غرمه مو پخیر زه ستاسو پام د "لینکس API" کتاب ته راوړم. جامع لارښود" (د کتاب ژباړه د لینکس پروګرام کولو انٹرفیس). دا د خپرونکي په ویب پاڼه کې امر کیدی شي، او که تاسو د پرومو کوډ پلي کړئ LinuxAPI تاسو به 30٪ تخفیف ترلاسه کړئ.

د کتنې لپاره له کتاب څخه یوه اقتباس:

ساکټونه: د سرور جوړښت

په دې څپرکي کې، موږ به د تکراري او موازي سرورونو ډیزاین کولو اساساتو په اړه بحث وکړو، په بیله بیا د یو ځانګړي انټ ډیمون چې د سرور خواو انټرنیټ غوښتنلیکونو رامینځته کول اسانه کوي.

تکرار او موازي سرورونه

دوه عام ساکټ پر بنسټ د شبکې سرور جوړښتونه شتون لري:

  • تکراري: سرور په یو وخت کې پیرودونکو ته خدمت کوي ، لومړی د یو پیرودونکي غوښتنې (یا څو غوښتنې) پروسس کوي او بیا بل ته ځي؛

  • موازي: سرور په ورته وخت کې د ډیری پیرودونکو خدمت کولو لپاره ډیزاین شوی.

برخه 44.8 دمخه د FIFO قطارونو پراساس د تکرار سرور مثال وړاندې کړی.

د تکرار سرورونه معمولا یوازې په داسې شرایطو کې مناسب وي چیرې چې د پیرودونکي غوښتنې په کافي اندازه ګړندي پروسس کیدی شي ، ځکه چې هر پیرودونکی باید انتظار وکړي تر هغه چې د هغې مخې ته کوم بل پیرودونکي خدمت شوي وي. د دې تګلارې لپاره د عام استعمال قضیه د پیرودونکي او سرور ترمنځ د واحد غوښتنې او ځوابونو تبادله ده.

موازي سرورونه په هغه قضیو کې مناسب دي چیرې چې هره غوښتنه پروسس کولو لپاره د پام وړ وخت نیسي ، یا پیرودونکي او سرور د پیغامونو اوږد تبادله لري. په دې څپرکي کې، موږ به په عمده توګه د موازي سرورونو ډیزاین کولو دودیزې (او اسانه) لارې تمرکز وکړو، کوم چې د هر نوي پیرودونکي لپاره د ماشوم جلا پروسې رامینځته کول دي. دا ډول پروسه د پیرودونکي خدمت کولو ټول کارونه ترسره کوي، وروسته له هغې چې پای ته ورسیږي. څرنګه چې د دې هرې پروسې په خپلواکه توګه کار کوي، دا ممکنه ده چې په ورته وخت کې ډیری پیرودونکو ته خدمت وکړئ. د اصلي سرور پروسې اصلي دنده (والدین) د هر نوي پیرودونکي لپاره جلا ماشوم رامینځته کول دي (په بدیل سره ، د پروسو پرځای ، تاسو کولی شئ د اجرا کولو تارونه رامینځته کړئ).

په لاندې برخو کې، موږ به د انټرنیټ ډومین ساکټ پر بنسټ د تکراري او موازي سرورونو مثالونه وګورو. دا دوه سرورونه د اکو خدمت (RFC 862) ساده نسخه پلي کوي چې د پیرودونکي لخوا ورته لیږل شوي هر پیغام کاپي بیرته راګرځوي.

د اکو تکرار udp سرور

په دې او راتلونکې برخه کې، موږ به د اکو خدمت لپاره سرورونه معرفي کړو. دا په 7 نمبر پورټ کې شتون لري او په UDP او TCP دواړو کې کار کوي (دا پورټ خوندي دی ، او له همدې امله د اکو سرور باید د مدیر امتیازاتو سره پرمخ ولاړ شي).

د اکو UDP سرور په دوامداره توګه ډیټاګرامونه لولي او لیږونکي ته یې کاپي بیرته ورکوي. څرنګه چې سرور یوازې په یو وخت کې یو پیغام پروسس کولو ته اړتیا لري، یو تکراري جوړښت به دلته کافي وي. د سرورونو لپاره د سرلیک فایل په لیست کولو 56.1-XNUMX کې ښودل شوی.

لیست کول 56.1. د پروګرامونو لپاره د سرلیک فایل id_echo_sv.c او id_echo_cl.c

# شامل کړئ "inet_sockets.h" /* زموږ د ساکټ دندې اعلانوي */
# "tlpi_hdr.h" شامل کړئ

#SERVICE "echo" تعریف کړئ /* د UDP خدمت نوم */

# تعریف کړئ 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 argc, char *argv[])
{
int sfd;
ssize_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);

که (نوم لوستل == -1)
errExit("recvfrom");
که (sendto(sfd, buf, numRead, 0, (struct sockaddr *) & claddr, len)
!= شمېره ولولئ)
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 argc, char *argv[])
{
int sfd,j;
size_tlen;
ssize_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);
که (نوم لوستل == -1)
errExit("لوستل");
printf("[%ld bytes] %.*sn", (long) 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