Incwadi "Linux API. IsiKhokelo esiBanzi"


Incwadi "Linux API. IsiKhokelo esiBanzi"

Mholo Ndinikela ingqalelo yakho incwadi ethi "Linux API. Isikhokelo esibanzi" (inguqulelo yencwadi I-Linux Programming Interface). Iyakwazi uku-odolwa kwiwebhusayithi yomshicileli, kwaye ukuba usebenzisa ikhowudi yokuphromotha LinuxAPI , uya kufumana i-30% isaphulelo.

Isicatshulwa kwincwadi yereferensi:

Iziseko: iServer Architecture

Kwesi sahluko, siza kuxubusha iziseko zokuyila iiseva eziphindaphindwayo kunye nezihambelanayo, kwaye sijonge kwakhona i-daemon ekhethekileyo ebizwa ngokuba yi-inetd, eyenza kube lula ukwenza izicelo zeseva ye-Intanethi.

Iiseva eziphindaphindayo kunye nezinxuseneyo

Zimbini ii-architecture zeseva yenethiwekhi esekwe kwisiseko eziqhelekileyo:

  • iterative: umncedisi unceda abaxhasi omnye ngexesha, kuqala ngokusetyenzwa kwesicelo (okanye izicelo ezininzi) kumxhasi omnye kwaye emva koko uye phambili;

  • parallel: iseva yenzelwe ukukhonza abaxhasi abaninzi ngaxeshanye.

Umzekelo weseva ephinda-phindayo esekwe kwimigca yeFIFO sele ibonisiwe kwiCandelo lama-44.8.

Iiseva eziphindaphindayo zihlala zifanelekile kuphela kwiimeko apho izicelo zabaxumi zinokuthi ziqwalaselwe ngokukhawuleza, kuba umxhasi ngamnye unyanzelekile ukuba alinde de kubekho abanye abathengi abaphambi kwayo. Imeko yokusetyenziswa okuqhelekileyo kule ndlela kukutshintshiselana kwezicelo ezizodwa kunye neempendulo phakathi komthengi kunye nomncedisi.

Iiseva ezihambelanayo zifanelekile kwiimeko apho isicelo ngasinye sithatha ixesha elibalulekileyo lokusiqhuba, okanye apho umxhasi kunye nomncedisi babandakanyeka kutshintshiselwano olude lomyalezo. Kwesi sahluko, siza kugxila ikakhulu kwindlela yemveli (kwaye elula) yokuyila iiseva ezihambelanayo, kukwenza inkqubo yomntwana eyahlukileyo kumxhasi ngamnye omtsha. Le nkqubo yenza wonke umsebenzi wokusebenzela umxhasi kwaye iphele. Ngenxa yokuba nganye yezi nkqubo isebenza ngokuzimeleyo, kunokwenzeka ukukhonza abaxhasi abaninzi ngaxeshanye. Umsebenzi oyintloko wenkqubo yomncedisi oyintloko (umzali) kukudala umntwana ohlukeneyo kumxhasi ngamnye omtsha (kungenjalo, imicu yokubulawa inokudalwa endaweni yeenkqubo).

Kula macandelo alandelayo, siza kujonga imizekelo yeeseva zesokhethi ze-intanethi eziphindaphindwayo kunye nezihambelanayo. Ezi zincedisi zimbini zisebenzisa inguqulelo eyenziwe lula yenkonzo ye-echo (RFC 862), ebuyisela ikopi yawo nawuphi na umyalezo othunyelwe kuyo ngumxhasi.

I-echo yeseva ye-UDP ephindaphindiweyo

Kweli candelo nakwelilandelayo sizakwazisa abancedisi benkonzo ye-echo. Ifumaneka kwinombolo ye-port ye-7 kwaye isebenza ngaphezu kwe-UDP kunye ne-TCP (eli zibuko ligcinwe, kwaye ngoko ke umncedisi we-echo kufuneka aqhutywe ngamalungelo omlawuli).

Iseva ye-echo ye-UDP ifunda ngokuqhubekayo iidatagrams kwaye ibuyisela iikopi zabo kumthumeli. Ekubeni umncedisi ufuna kuphela ukucubungula umyalezo omnye ngexesha, ulwakhiwo oluphindaphindayo luyakwanela. Ifayile yeheader yeeseva iboniswe kuLuhlu 56.1.

Uluhlu 56.1. Ifayili yeheader yeenkqubo id_echo_sv.c kunye ne-id_echo_cl.c

#bandakanya "inet_sockets.h" /* Ichaza imisebenzi yethu yesokhethi */
#bandakanya "tlpi_hdr.h"

#chaza INKONZO "echo" /* igama lenkonzo ye-UDP */

#chaza BUF_SIZE 500 /* Ubuninzi bobungakanani beedatagram
inokufundwa ngumxhasi kunye nomncedisi */
____________________________________________________________________________________iziseko/id_echo.h

Uluhlu lwe-56.2 lubonisa ukuphunyezwa komncedisi. Ezi ngongoma zilandelayo zifanele ukuqwalaselwa:

  • ukubeka umncedisi kwimo yedaemon, sisebenzisa i becomeDaemon () umsebenzi ukusuka kwicandelo 37.2;

  • ukwenza inkqubo ihlangane ngakumbi, sisebenzisa ithala leencwadi ekusebenzeni kunye neziseko zesizinda se-Intanethi, eziphuhliswe kwicandelo 55.12;

  • Ukuba umncedisi akanakubuyisela impendulo kumxhasi, ibhala umyalezo kwilog isebenzisa i syslog () umnxeba.

Kwisicelo sokwenyani, sinokuthi sibeke umda kuphindaphindo lwemiyalezo yokuloga usebenzisa isyslog (). Oku kuya kuphelisa ukuba nokwenzeka kokuba umhlaseli aphuphume kushicilelo lwenkqubo. Ukongeza, ungalibali ukuba umnxeba ngamnye kwi syslog () ubiza kakhulu, kuba isebenzisa fsync () ngokungagqibekanga.

Uluhlu 56.2. Iseva yokuphindaphinda esebenzisa inkonzo ye-echo ye-UDP

_______________________________________________________________________________iziseko/id_echo_sv.c
#zibandakanya
#quka "id_echo.h"
#zibandakanya "become_daemon.h"

int
eyona (int argc, char *argv[])
{
int sfd;
ubungakanani_t inaniFunda;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

ukuba (ibe yiDaemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(INKONZO, SOCK_DGRAM, NULL);
ukuba (sfd == -1) {
syslog(LOG_ERR, "Ayinakwenza isiseko somncedisi (%s)",
strerror(errno));
phuma(EXIT_FAILURE);

/* Fumana idatagrams kwaye ubuyisele iikopi zabo kubathumeli */
}
ye (;;) {
len = sizeof(isakhiwo sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

ukuba (inaniFunda == -1)
errExit("recvfrom");
ukuba (thumela ku(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= inani elifundiweyo)
syslog(LOG_WARNING, "Impazamo ephinda impendulo kwi-%s (%s)",
inetAddressStr((isakhiwo sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_______________________________________________________________________________iziseko/id_echo_sv.c

Ukuvavanya ukusebenza komncedisi, sisebenzisa inkqubo esuka kuLuhlu 56.3. Ikwasebenzisa ithala leencwadi ekusebenzeni ngeesokethi zommandla we-Intanethi, ophuhliswe kwicandelo 55.12. Njengengxoxo yomgca wokuqala womyalelo, inkqubo yomxhasi ithatha igama le-node yenethiwekhi apho iseva ikhoyo. Umxhasi ungena kwi-loop apho ithumela nganye yeengxabano eziseleyo kumncedisi njengedathagrams eyahlukileyo, kwaye emva koko ifunde kwaye iprinte idathagrams eyifumana kumncedisi ekuphenduleni.

Uluhlu 56.3. Umxhasi wenkonzo ye-echo ye-UDP

#quka "id_echo.h"

int
eyona (int argc, char *argv[])
{
int sfd, j;
ubukhulu_t len;
ubungakanani_t inaniFunda;
char buf[BUF_SIZE];

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

/* Yenza idilesi yomncedisi ngokusekwe kwimpikiswano yomgca wokuqala womyalelo */
sfd = inetConnect(argv[1], INKONZO, SOCK_DGRAM);
ukuba (sfd == -1)
fatal("Ayikwazanga ukudibanisa kwisokethi yeseva");

/* Thumela iingxoxo ezishiyekileyo kumncedisi ngohlobo lweedathagram ezahlukeneyo */
ye (j = 2; j < argc; j++) {
len = strlen(argv[j]);
ukuba (bhala(sfd, argv[j], len) != len)
fatal("inxalenye/yokusilela ukubhala");

numRead = funda(sfd, buf, BUF_SIZE);
ukuba (inaniFunda == -1)
errExit("funda");
printf("[%ld bytes] %.*sn", (nde) numRead, (int) numRead, buf);
}
phuma(EXIT_SUCCESS);
}
_______________________________________________________________________________iziseko/id_echo_cl.c

Apha ngezantsi ngumzekelo wento esiya kuyibona xa usebenzisa iseva kunye neemeko ezimbini zabaxumi:

$su // Amalungelo afunekayo ukubophelela kwizibuko eligciniweyo
Inombolo yokuvula:
# ./id_echo_sv // Umncedisi uya kwimowudi yangasemva
# phuma // Nika amalungelo omlawuli
$ ./id_echo_cl localhost molo hlabathi // Lo mxhasi uthumela idathagram ezimbini
[5 bytes] molo // Umxhasi ubonisa impendulo efunyenwe kumncedisi
[5 bytes] ihlabathi
$ ./id_echo_cl localhost goodbye // Lo mxhasi uthumela idathagram enye
[7 bytes] sala kakuhle

Ndikunqwenelela ukufunda okumnandi)

umthombo: linux.org.ru