Leabhar “Linux API. Treoir Chuimsitheach"


Leabhar “Linux API. Treoir Chuimsitheach"

Tráthnóna maith Cuirim i láthair d'aird an leabhar “Linux API. Treoir chuimsitheach" (aistriúchán ar an leabhar Comhéadan Cláir Linux). Is féidir é a ordú ar shuíomh Gréasáin an fhoilsitheora, agus má chuireann tú an cód promóisin i bhfeidhm LinuxAPI , gheobhaidh tú lascaine 30%.

Sliocht as an leabhar mar thagairt:

Soicéid: Ailtireacht Freastalaí

Sa chaibidil seo, déanfaimid plé ar na bunghnéithe a bhaineann le freastalaithe atriallach agus comhthreomhara a dhearadh, agus féachfaimid freisin ar dheamhan speisialta ar a dtugtar inetd, rud a fhágann go bhfuil sé níos éasca feidhmchláir freastalaí Idirlín a chruthú.

Freastalaithe atriallach agus comhthreomhara

Tá dhá ailtireacht fhreastalaí líonra soicéad-bhunaithe coitianta ann:

  • atriallach: déanann an freastalaí freastal ar chliaint uair amháin ag an am, ag próiseáil iarratas (nó roinnt iarratas) ó chliant amháin ar dtús agus ag bogadh ar aghaidh go dtí an chéad cheann eile;

  • comhthreomhar: tá an freastalaí deartha chun freastal ar chliaint iolracha ag an am céanna.

Cuireadh sampla de fhreastalaí atriallach bunaithe ar scuainí FIFO i láthair cheana féin i Roinn 44.8.

De ghnáth ní bhíonn freastalaithe atriallach oiriúnach ach amháin i gcásanna inar féidir iarratais cliant a phróiseáil go measartha tapa, ós rud é go gcuirtear iallach ar gach cliant fanacht go dtí go mbeidh freastal déanta ar aon chliaint eile os a chomhair. Cás úsáide coitianta don chur chuige seo is ea malartú iarratas aonair agus freagraí idir cliant agus freastalaí.

Tá freastalaithe comhthreomhara oiriúnach i gcásanna ina dtógann sé méid suntasach ama le próiseáil a dhéanamh ar gach iarratas, nó ina mbíonn an cliant agus an freastalaí i mbun malartuithe fada teachtaireachtaí. Sa chaibidil seo, díreoimid go príomha ar an mbealach traidisiúnta (agus is simplí) chun freastalaithe comhthreomhara a dhearadh, is é sin próiseas leanaí ar leith a chruthú do gach cliant nua. Déanann an próiseas seo an obair ar fad chun freastal ar an gcliant agus ansin críochnaíonn sé. Toisc go n-oibríonn gach ceann de na próisis seo go neamhspleách, is féidir freastal ar chliaint iolracha ag an am céanna. Is é príomhthasc an phróisis phríomhfhreastalaí (tuismitheoir) leanbh ar leith a chruthú do gach cliant nua (mar mhalairt air sin, is féidir snáitheanna forghníomhaithe a chruthú in ionad próisis).

Sna hailt seo a leanas, féachfaimid ar shamplaí de fhreastalaithe soicéad fearainn idirlín atriallach agus comhthreomhara. Cuireann an dá fhreastalaí seo leagan simplithe den tseirbhís macalla i bhfeidhm (RFC 862), a sheolann ar ais cóip d’aon teachtaireacht a sheol cliant chuige.

Macalla freastalaí UDP atriallach

Sa chuid seo agus sa chéad chuid eile tabharfaimid isteach na freastalaithe don tseirbhís macalla. Tá sé ar fáil ar chalafort uimhir 7 agus oibríonn sé thar UDP agus TCP araon (tá an calafort seo in áirithe, agus mar sin ní mór an freastalaí macalla a rith le pribhléidí riarthóra).

Léann an freastalaí macalla UDP datagramanna go leanúnach agus cuireann sé cóipeanna díobh ar ais chuig an seoltóir. Ós rud é nach gá don fhreastalaí ach teachtaireacht amháin a phróiseáil ag an am, is leor ailtireacht atriallach. Taispeántar an comhad ceanntásca do na freastalaithe i Liostú 56.1.

Liostáil 56.1. Comhad ceanntásca do chláir id_echo_sv.c agus id_echo_cl.c

# cuir "inet_sockets.h" /* Dearbhaíonn feidhmeanna ár soicéad */
#cuir "tlpi_hdr.h" san áireamh

#define SEIRBHÍS "macalla" /* ainm seirbhíse UDP */

#define BUF_SIZE 500 /* Uasmhéid na datagrams sin
is féidir leis an gcliant agus leis an bhfreastalaí é a léamh */
______________________________________________________ soicéid/id_echo.h

Léiríonn liostú 56.2 cur i bhfeidhm an fhreastalaí. Is fiú na pointí seo a leanas a thabhairt faoi deara:

  • chun an freastalaí a chur i mód deamhan, úsáidimid an fheidhm becomeDaemon() ó alt 37.2;

  • chun an clár a dhéanamh níos dlúithe, bainimid úsáid as an leabharlann chun oibriú le soicéid fearainn Idirlín, a forbraíodh in alt 55.12;

  • murar féidir leis an bhfreastalaí freagra a thabhairt ar ais don chliant, scríobhann sé teachtaireacht chuig an loga ag baint úsáide as an nglao syslog().

I bhfíor-fheidhmchlár, is dócha go gcuirfimis teorainn éigin i bhfeidhm ar mhinicíocht logáil teachtaireachtaí ag baint úsáide as syslog(). Chuirfeadh sé seo deireadh leis an bhféidearthacht go mbeadh ionsaitheoir ag cur thar maoil le logáil an chórais. Ina theannta sin, ná déan dearmad go bhfuil gach glao chuig syslog() costasach go leor, ós rud é go n-úsáideann sé fsync() de réir réamhshocraithe.

Liostáil 56.2. Freastalaí atriallta a chuireann seirbhís macalla an UDP i bhfeidhm

_________________________________________________________________ soicéid/id_echo_sv.c
#cuir san áireamh
#cuir "id_echo.h" san áireamh
#cuir "become_daemon.h" san áireamh

int
príomh(int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

más rud é (bheith Deamhan(0) == -1)
errExit ("bheith Deamhan");

sfd = inetBind(SEIRBHÍS, SOCK_DGRAM, NULL);
má (sfd == -1) {
syslog(LOG_ERR, "Níorbh fhéidir soicéad freastalaí (%s) a chruthú",
earráid(errno));
scoir(EXIT_FAILURE);

/* Faigh sonraígramanna agus seol cóipeanna díobh chuig na seoltóirí */
}
le haghaidh (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

má (numRead == -1)
errExit("recvfrom");
más rud é (seol chuig(sfd, buf, numRead, 0, (struct sockaddr*) &claddr, len)
!= numLéamh)
syslog(LOG_WARNING, "Earráid agus freagra á mhacalla ar %s (%s)",
inetAddressStr((struct sockaddr*) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
earráid(errno));
}
}
_________________________________________________________________ soicéid/id_echo_sv.c

Chun oibriú an fhreastalaí a thástáil, úsáidimid an clár ó Liostú 56.3. Úsáideann sé an leabharlann freisin chun oibriú le soicéid fearainn Idirlín, a forbraíodh i rannán 55.12. Mar an chéad argóint líne ordaithe, glacann an clár cliant ainm an nód líonra ar a bhfuil an freastalaí suite. Téann an cliant isteach lúb ina seolann sé gach ceann de na hargóintí atá fágtha chuig an bhfreastalaí mar datagrams ar leith, agus ansin léann agus priontaí na datagrams a fhaigheann sé ón bhfreastalaí mar fhreagra.

Liostáil 56.3. Cliant le haghaidh seirbhís macalla UDP

#cuir "id_echo.h" san áireamh

int
príomh(int argc, char *argv[])
{
int sfd, j;
méid_t len;
ssize_t numRead;
char buf[BUF_SIZE];

más rud é (argc < 2 || strcmp(argv[1], "--help") == 0)
useErr("%s ósta msg…n", argv[0]);

/* Foirm seoladh an fhreastalaí bunaithe ar argóint na chéad ordaithe */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
má (sfd == -1)
marfach ("Níorbh fhéidir ceangal leis an soicéad freastalaí");

/* Seol na hargóintí eile chuig an bhfreastalaí i bhfoirm datagramanna ar leith */
le haghaidh (j = 2; j < argc; j++) {
len = strlen(argv[j]);
má (scríobh(sfd, argv[j], len) != len)
marfach (“an scríobh páirteach/theip”);

numRead = léigh(sfd, buf, BUF_SIZE);
má (numRead == -1)
errExit("léamh");
printf("[%ld bytes] %.*sn", (fada) numRead, (int) numRead, buf);
}
scoir (EXIT_SUCCESS);
}
_________________________________________________________________ soicéid/id_echo_cl.c

Seo thíos sampla de na rudaí a fheicfimid agus an freastalaí á rith agus dhá chás cliant:

$su // Tá pribhléidí ag teastáil chun ceangal a dhéanamh le calafort in áirithe
Pasfhocal:
# ./id_echo_sv // Téann an freastalaí isteach sa mhód cúlra
# scoir // Tabhair suas cearta riarthóra
$ ./id_echo_cl localhost hello world // Seolann an cliant seo dhá datagram
[5 bytes] hello // Taispeánann an cliant an freagra a fuarthas ón bhfreastalaí
[5 bytes] domhan
$ ./id_echo_cl localhost slán // Seolann an cliant seo datagram amháin
[7 bytes] slán

Ba mhaith liom léamh taitneamhach duit)

Foinse: linux.org.ru