Archebwch “Linux API. Canllaw cynhwysfawr"


Archebwch “Linux API. Canllaw cynhwysfawr"

Prynhawn Da Cyflwynaf i'ch sylw y llyfr “Linux API. Canllaw cynhwysfawr" (cyfieithiad o'r llyfr Y Rhyngwyneb Rhaglennu Linux). Gellir ei archebu ar wefan y cyhoeddwr, ac os ydych chi'n cymhwyso'r cod hyrwyddo LinuxAPI , byddwch yn derbyn gostyngiad o 30%.

Dyfyniad o'r llyfr er gwybodaeth:

Socedi: Gweinyddwr Pensaernïaeth

Yn y bennod hon, byddwn yn trafod hanfodion dylunio gweinyddwyr ailadroddol a chyfochrog, a hefyd yn edrych ar daemon arbennig o'r enw inetd, sy'n ei gwneud hi'n haws creu cymwysiadau gweinydd Rhyngrwyd.

Gweinyddion iterus a chyfochrog

Mae dwy saernïaeth gweinydd rhwydwaith gyffredin yn seiliedig ar soced:

  • iterus: mae'r gweinydd yn gwasanaethu cleientiaid un ar y tro, yn gyntaf yn prosesu cais (neu sawl cais) gan un cleient ac yna'n symud ymlaen i'r nesaf;

  • cyfochrog: mae'r gweinydd wedi'i gynllunio i wasanaethu cleientiaid lluosog ar yr un pryd.

Cyflwynwyd enghraifft o weinydd iteraidd yn seiliedig ar giwiau FIFO eisoes yn Adran 44.8.

Mae gweinyddwyr iterus fel arfer ond yn addas mewn sefyllfaoedd lle gellir prosesu ceisiadau cleient yn weddol gyflym, gan fod pob cleient yn cael ei orfodi i aros nes bod unrhyw gleientiaid eraill o'i flaen wedi'u cyflwyno. Achos defnydd cyffredin ar gyfer y dull hwn yw cyfnewid ceisiadau ac ymatebion unigol rhwng cleient a gweinydd.

Mae gweinyddwyr cyfochrog yn addas mewn achosion lle mae pob cais yn cymryd cryn dipyn o amser i'w brosesu, neu lle mae'r cleient a'r gweinydd yn cyfnewid negeseuon hir. Yn y bennod hon, byddwn yn canolbwyntio'n bennaf ar y ffordd draddodiadol (a symlaf) o ddylunio gweinyddwyr cyfochrog, sef creu proses plentyn ar wahân ar gyfer pob cleient newydd. Mae'r broses hon yn perfformio'r holl waith i wasanaethu'r cleient ac yna'n dod i ben. Oherwydd bod pob un o'r prosesau hyn yn gweithredu'n annibynnol, mae'n bosibl gwasanaethu cleientiaid lluosog ar yr un pryd. Prif dasg y brif broses gweinydd (rhiant) yw creu plentyn ar wahân ar gyfer pob cleient newydd (fel arall, gellir creu edafedd gweithredu yn lle prosesau).

Yn yr adrannau canlynol, byddwn yn edrych ar enghreifftiau o weinyddion soced parth rhyngrwyd ailadroddol a chyfochrog. Mae'r ddau weinydd hyn yn gweithredu fersiwn symlach o'r gwasanaeth adlais (RFC 862), sy'n dychwelyd copi o unrhyw neges a anfonwyd ato gan gleient.

Adlais gweinydd CDU iteraidd

Yn yr adran hon a'r adran nesaf byddwn yn cyflwyno'r gweinyddion ar gyfer y gwasanaeth adlais. Mae ar gael ar borthladd rhif 7 ac mae'n gweithio dros CDU a TCP (mae'r porthladd hwn wedi'i gadw, ac felly mae'n rhaid i'r gweinydd adleisio gael ei redeg gyda breintiau gweinyddwr).

Mae'r gweinydd CDU adlais yn darllen datagramau yn barhaus ac yn dychwelyd copïau ohonynt i'r anfonwr. Gan mai dim ond un neges y mae angen i'r gweinydd ei phrosesu ar y tro, bydd saernïaeth ailadroddol yn ddigon. Dangosir y ffeil pennawd ar gyfer y gweinyddwyr yn Rhestr 56.1.

Rhestriad 56.1. Ffeil pennawd ar gyfer rhaglenni id_echo_sv.c ac id_echo_cl.c

#cynnwys "inet_sockets.h" /* Yn datgan swyddogaethau ein soced */
#cynnwys "tlpi_hdr.h"

#define SERVICE "echo" /* enw gwasanaeth CDU */

#define BUF_SIZE 500 /* Maint mwyaf y datagramau hynny
gellir ei ddarllen gan y cleient a'r gweinydd */
______________________________________________________ socedi/id_echo.h

Mae rhestru 56.2 yn dangos gweithrediad y gweinydd. Mae'n werth nodi'r pwyntiau canlynol:

  • i roi'r gweinydd yn y modd daemon, rydyn ni'n defnyddio'r ffwythiant becomeDaemon() o adran 37.2;

  • i wneud y rhaglen yn fwy cryno, rydym yn defnyddio'r llyfrgell ar gyfer gweithio gyda socedi parth Rhyngrwyd, a ddatblygwyd yn adran 55.12;

  • os na all y gweinydd ddychwelyd ymateb i'r cleient, mae'n ysgrifennu neges i'r log gan ddefnyddio'r alwad syslog ().

Mewn cymhwysiad go iawn, mae'n debyg y byddem yn gosod rhywfaint o gyfyngiad ar amlder logio negeseuon gan ddefnyddio syslog (). Byddai hyn yn dileu'r posibilrwydd y byddai ymosodwr yn gorlifo log y system. Yn ogystal, peidiwch ag anghofio bod pob galwad i syslog () yn eithaf drud, gan ei fod yn defnyddio fsync() yn ddiofyn.

Rhestriad 56.2. Gweinydd iteru sy'n gweithredu gwasanaeth adlais y CDU

_________________________________________________________________ socedi/id_echo_sv.c
#cynnwys
#cynnwys "id_echo.h"
#cynnwys "become_daemon.h"

int
prif(int argc, torgoch *argv[])
{
int sfd;
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
torgoch llwyd[BUF_SIZE];
torgoch addrStr[IS_ADDR_STR_LEN];

os (dod yn Daemon(0) == -1)
errExit ("dod yn Daemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
os (sfd == -1) {
syslog(LOG_ERR, "Methu creu soced gweinydd (%s)",
strerror(errno));
allanfa(EXIT_FAILURE);

/* Derbyn datagramau a dychwelyd copïau ohonynt i'r anfonwyr */
}
am (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (strwythur sockaddr *) &claddr, &len);

os (numRead == -1)
errExit ("recvfrom");
os (sendto(sfd, bwff, numRead, 0, (struct sockaddr*) &claddr, len))
!= numRead)
syslog(LOG_WARNING, "Gwall wrth adleisio ymateb i %s (%s)",
inetAddressStr((strwythur sockaddr*) &cladr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________ socedi/id_echo_sv.c

I brofi gweithrediad y gweinydd, rydym yn defnyddio'r rhaglen o Rhestru 56.3. Mae hefyd yn defnyddio'r llyfrgell ar gyfer gweithio gyda socedi parth Rhyngrwyd, a ddatblygwyd yn adran 55.12. Fel y ddadl llinell orchymyn gyntaf, mae'r rhaglen cleient yn cymryd enw'r nod rhwydwaith y mae'r gweinydd wedi'i leoli arno. Mae'r cleient yn mynd i mewn i ddolen lle mae'n anfon pob un o'r dadleuon sy'n weddill i'r gweinydd fel datagramau ar wahân, ac yna'n darllen ac yn argraffu'r datagramau y mae'n eu derbyn gan y gweinydd mewn ymateb.

Rhestriad 56.3. Cleient ar gyfer gwasanaeth atsain CDU

#cynnwys "id_echo.h"

int
prif(int argc, torgoch *argv[])
{
int sfd, j;
maint_t len;
ssize_t numRead;
torgoch llwyd[BUF_SIZE];

os (argc < 2 || strcmp(argv[1], "--help") == 0)
useErr("%s gwesteiwr msg…n", argv[0]);

/* Ffurfiwch gyfeiriad y gweinydd yn seiliedig ar ddadl y llinell orchymyn gyntaf */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
os (sfd == -1)
angheuol ("Methu cysylltu â soced gweinydd");

/* Anfon y dadleuon sy'n weddill i'r gweinydd ar ffurf datagramau ar wahân */
ar gyfer (j = 2; j < argc; j++) {
len = strlen(argv[j]);
os (ysgrifennu(sfd, argv[j], len) != len)
angheuol ("ysgrifennu rhannol/methu");

numRead = darllen(sfd, bwff, BUF_SIZE);
os (numRead == -1)
errExit ("darllen");
printf("[%ld beit] %.*sn", (hir) numRead, (int) numRead, buf);
}
allanfa(EXIT_SUCCESS);
}
_________________________________________________________________ socedi/id_echo_cl.c

Isod mae enghraifft o'r hyn y byddwn yn ei weld wrth redeg y gweinydd a dau achos cleient:

$su // Mae angen breintiau i rwymo i borthladd neilltuedig
cyfrinair:
# ./id_echo_sv // Gweinydd yn mynd i'r modd cefndir
# ymadael // Rhoi'r gorau i hawliau gweinyddwr
$ ./id_echo_cl localhost hello world // Mae'r cleient hwn yn anfon dau datagram
[5 bytes] helo // Mae'r cleient yn dangos yr ymateb a dderbyniwyd gan y gweinydd
[5 bytes] byd
$ ./id_echo_cl localhost hwyl fawr // Mae'r cleient hwn yn anfon un datagram
[7 bytes] hwyl fawr

Rwy'n dymuno darlleniad dymunol i chi)

Ffynhonnell: linux.org.ru