Leabhar "Linux API. Stiùireadh coileanta»


Leabhar "Linux API. Stiùireadh coileanta»

Feasgar math Bheir mi gu d’ aire an leabhar “Linux API. Stiùireadh coileanta” (eadar-theangachadh den leabhar Eadar-aghaidh prògramadh Linux). Faodar òrdachadh air làrach-lìn an fhoillsichear, agus ma chuireas tu an còd promo an sàs LinuxAPI gheibh thu lasachadh de 30%.

Earrann bhon leabhar airson ath-sgrùdadh:

Socaidean: ailtireachd frithealaiche

Anns a’ chaibideil seo, bruidhnidh sinn air bunaitean dealbhadh frithealaichean ath-aithriseach agus co-shìnte, a bharrachd air deamhan inetd sònraichte a chuidicheas le bhith a’ cruthachadh thagraidhean eadar-lìn taobh an fhrithealaiche.

Iteration agus Frithealaichean Co-shìnte

Tha dà ailtireachd frithealaiche lìonra stèidhichte air socaid cumanta:

  • ath-aithris: bidh am frithealaiche a’ frithealadh teachdaichean aon aig aon àm, an toiseach a’ giullachd iarrtas (no grunn iarrtasan) bho aon neach-dèiligidh agus an uairsin a’ gluasad air adhart chun ath fhear;

  • co-shìnte: tha am frithealaiche air a dhealbhadh gus seirbheis a thoirt do dh'iomadh neach-dèiligidh aig an aon àm.

Tha Earrann 44.8 mu thràth air eisimpleir a thoirt seachad de fhrithealaiche ath-aithris stèidhichte air ciudhaichean FIFO.

Mar as trice chan eil luchd-frithealaidh itealain freagarrach ach ann an suidheachaidhean far am faodar iarrtasan teachdaiche a làimhseachadh gu math luath, oir feumaidh gach neach-dèiligidh feitheamh gus am bi teachdaichean sam bith eile air a bheulaibh air am frithealadh. Is e cùis cleachdaidh cumanta airson an dòigh-obrach seo a bhith ag iomlaid iarrtasan agus freagairtean singilte eadar teachdaiche agus frithealaiche.

Tha luchd-frithealaidh co-shìnte freagarrach ann an cùisean far a bheil gach iarrtas a 'toirt ùine mhòr airson a phròiseasadh, no far a bheil an neach-dèiligidh agus an t-seirbheisiche a' dèanamh iomlaid fhada de theachdaireachdan. Anns a’ chaibideil seo, cuiridh sinn fòcas gu sònraichte air an dòigh thraidiseanta (agus as fhasa) air frithealaichean co-shìnte a dhealbhadh, is e sin pròiseas cloinne fa-leth a chruthachadh airson gach teachdaiche ùr. Bidh a leithid de phròiseas a 'dèanamh a h-uile obair a bhith a' frithealadh an neach-dèiligidh, agus an dèidh sin thig e gu crìch. Leis gu bheil gach aon de na pròiseasan sin ag obair gu neo-eisimeileach, tha e comasach seirbheis a thoirt do dh'iomadh neach-dèiligidh aig an aon àm. Is e prìomh obair pròiseas prìomh fhrithealaiche (pàrant) leanabh fa leth a chruthachadh airson gach neach-dèiligidh ùr (air an làimh eile, an àite pròiseasan, faodaidh tu snàithleanan cur gu bàs a chruthachadh).

Anns na h-earrannan a leanas, seallaidh sinn ri eisimpleirean de luchd-frithealaidh ath-aithriseach agus co-shìnte stèidhichte air socaidean àrainn eadar-lìn. Bidh an dà fhrithealaiche seo a’ cur an gnìomh dreach nas sìmplidhe den t-seirbheis mac-talla (RFC 862) a thilleas leth-bhreac de theachdaireachd sam bith a chuir an neach-dèiligidh thuige.

frithealaiche udp iteration mac-talla

Anns an earrainn seo agus an ath earrann, bheir sinn a-steach frithealaichean airson an t-seirbheis mac-talla. Tha e ri fhaighinn air port àireamh 7 agus bidh e ag obair an dà chuid thairis air UDP agus TCP (tha am port seo glèidhte, agus mar sin feumaidh am frithealaiche mac-talla a bhith air a ruith le sochairean rianadair).

Bidh am frithealaiche mac-talla UDP an-còmhnaidh a’ leughadh datagrams agus a’ tilleadh lethbhric dhiubh chun neach a chuir e. Leis nach fheum am frithealaiche ach aon teachdaireachd a phròiseasadh aig an aon àm, bidh ailtireachd ath-aithriseach gu leòr an seo. Tha am faidhle cinn airson frithealaichean ri fhaicinn ann an Liosta 56.1-XNUMX.

Clàradh 56.1. Faidhle cinn airson prògraman id_echo_sv.c agus id_echo_cl.c

# cuir a-steach "inet_sockets.h" /* Ag ainmeachadh ar gnìomhan socaid */
# cuir a-steach "tlpi_hdr.h"

#define SEIRBHEIS "mac-talla" /* ainm seirbheis UDP */

#define BUF_SIZE 500 /* Meud as motha de dhàtagraman a tha
faodar a leughadh leis an neach-dèiligidh agus an fhrithealaiche */
________________________________________________________________________ socaidean/id_echo.h

Tha liostadh 56.2-XNUMX a’ sealltainn buileachadh an fhrithealaiche. 'S fhiach toirt fa-near na puingean a leanas:

  • gus am frithealaiche a chuir ann am modh daemon, bidh sinn a’ cleachdadh an gnìomh becomeDaemon() bho Earrann 37.2;

  • gus am prògram a dhèanamh nas toinnte, bidh sinn a’ cleachdadh an leabharlann socaid àrainn eadar-lìn a chaidh a leasachadh ann an earrann 55.12;

  • mura h-urrainn don fhrithealaiche freagairt a thilleadh chun neach-dèiligidh, bidh e a’ sgrìobhadh teachdaireachd chun log a ’cleachdadh a’ ghairm syslog ().

Ann an tagradh fìor, bhiodh sinn dualtach crìoch sònraichte a chuir air tricead teachdaireachdan logaidh a’ cleachdadh syslog (). Chuireadh seo às don chomas gum biodh neach-ionnsaigh a’ cur thairis air log an t-siostaim. Cuideachd, cumaibh cuimhne gu bheil gach gairm syslog () gu math daor, leis gu bheil e a’ cleachdadh fsync () gu bunaiteach.

Clàradh 56.2. Frithealaiche ath-aithris a chuireas an gnìomh seirbheis mac-talla UDP

_________________________________________________________________ socaidean/id_echo_sv.c
# gabhail a-steach
# cuir a-steach "id_echo.h"
# cuir a-steach "become_daemon.h"

int
prìomh (int argc, char * argv[])
{
int sfd;
ssize_t numRead;
socklen_tlen;
struct sockaddr_storage claddr;
charbuf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

ma tha (fàs Daemon(0) == -1)
errExit ("becomeDaemon");

sfd = inetBind(SEIRBHEIS, SOCK_DGRAM, NULL);
ma tha (sfd == -1) {
syslog(LOG_ERR, "Cha b' urrainn dhuinn socaid an fhrithealaiche (%s) a chruthachadh",
mearachd (errno));
fàgail (EXIT_FAILURE);

/* Faigh dàtagraman agus till lethbhric gu luchd-cuiridh */
}
airson (;;) {
len = sizeof (structar sockaddr_storage);
numRead = recvfrom (sfd, buf, BUF_SIZE, 0, (structar sockaddr *) &claddr, &len);

ma tha (numRead == -1)
errExit ("recvfrom");
ma tha (sendto (sfd, buf, numRead, 0, (struct sockaddr *) & claddr, len)
!=numLeugh)
syslog(LOG_WARNING, "Mearachd le mac-talla freagairt ri %s (%s)",
inetAddressStr((structar sockaddr*) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
mearachd (errno));
}
}
_________________________________________________________________ socaidean/id_echo_sv.c

Cleachdaidh sinn am prògram ann an liostadh 56.3 gus am frithealaiche a dhearbhadh. Bidh e cuideachd a’ cleachdadh an leabharlann socaid àrainn eadar-lìn a chaidh a leasachadh ann an Earrann 55.12. Bidh am prògram teachdaiche a’ gabhail ainm an aoigh lìonra far a bheil am frithealaiche suidhichte mar a’ chiad argamaid air an loidhne-àithne. Bidh an neach-dèiligidh a’ dol a-steach do lùb far am bi e a’ cur gach aon de na h-argamaidean a tha air fhàgail chun t-seirbheisiche mar datagraman fa leth, agus an uairsin a’ leughadh agus a’ toirt a-mach na datagraman a fhuaireadh bhon fhrithealaiche mar fhreagairt.

Clàradh 56.3. Cliant airson seirbheis echo UDP

# cuir a-steach "id_echo.h"

int
prìomh (int argc, char * argv[])
{
int sfd,j;
meud_tlen;
ssize_t numRead;
charbuf[BUF_SIZE];

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

/* Cruthaich seòladh an fhrithealaiche stèidhichte air a’ chiad argamaid loidhne-àithne */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
ma tha (sfd == -1)
marbhtach ("Cha b' urrainn dhuinn ceangal ri socaid an fhrithealaiche");

/* Cuir an còrr de na h-argamaidean chun an fhrithealaiche mar datagraman air leth */
airson (j = 2; j < argc; j++) {
len = strlen(argv[j]);
ma tha (sgrìobh (sfd, argv[j], len) ! = len)
marbhtach ("sgrìobhadh pàirt / fàilligeadh");

numRead = leugh (sfd, buf, BUF_SIZE);
ma tha (numRead == -1)
errExit ("leugh");
printf ("[%ld bytes] %.*sn", (fada) numRead, (int) numRead, buf);
}
fàgail (EXIT_SUCCESS);
}
_________________________________________________________________ sockets/id_echo_cl.c

Tha na leanas na eisimpleir de na chì sinn nuair a thòisicheas sinn air an fhrithealaiche agus dà shuidheachadh teachdaiche:

$ su // Tha feum air sochairean gus ceangal ri port glèidhte
Facal-faire:
# ./id_echo_sv // Bidh am frithealaiche a’ dol a-steach don chùl
# fàgail // Leig seachad còraichean rianachd
$ ./id_echo_cl localhost hello world // Bidh an neach-dèiligidh seo a’ cur dà datagram
[5 bytes] hello // Bidh an neach-dèiligidh a’ toirt a-mach am freagairt a fhuaireadh bhon t-seirbheisiche
[5 bytes] saoghal
$ ./id_echo_cl localhost soraidh slàn // Bidh an neach-dèiligidh seo a’ cur aon datagram
[7 bytes] beannachd leat

Tha mi a’ guidhe leughadh tlachdmhor dhut)

Source: linux.org.ru