Buugga API Linux. Hage dhamaystiran


Buugga API Linux. Hage dhamaystiran

Galab wanaagsan Waxaan kuu soo bandhigay dareenkaaga buugga "Linux API. Hage dhammaystiran" (tarjumaadda buugga Interface-ka Programming-ka Linux). Waxaa laga dalban karaa mareegta daabacaha, iyo haddii aad codsato koodhka xayeysiinta LinuxAPI , waxaad heli doontaa qiimo dhimis 30%.

Xigasho buugga oo tixraac ah:

Sockets: Server Architecture

Cutubkan, waxaynu kaga hadli doonaa aasaaska samaynta werwerka iyo isbarbardhigga, sidoo kale waxaan eegi doonaa daemon gaar ah oo loo yaqaan inetd, taas oo sahlaysa samaynta codsiyada server-yada internetka.

Iterative and parallel servers

Waxaa jira laba qaab-dhismeed shabakadeed ku salaysan godad caadi ah:

  • soo noqnoqoshada: server-ku wuxuu u adeegaa macaamiisha hal mar, marka hore wuxuu farsameeyaa codsi (ama codsiyo dhowr ah) oo ka yimid hal macmiil ka dibna u gudbaya kan xiga;

  • barbar socda: server-ka waxaa loogu talagalay inuu u adeego macaamiil badan isku mar.

Tusaalaha server-ka soo noqnoqda ee ku salaysan safafka FIFO ayaa mar hore lagu soo bandhigay Qaybta 44.8.

Adeegayaasha is dhexgalka ah ayaa caadi ahaan ku haboon kaliya xaaladaha codsiyada macmiilka si cadaalad ah loogu baaraandegi karo si dhakhso ah, maadaama macmiil kasta lagu qasbay inuu sugo ilaa macaamiisha kale ee hortiisa la keeno. Kiis caadi ah oo loo isticmaalo habkan waa isweydaarsiga codsiyo iyo jawaabaha u dhexeeya macmiilka iyo serverka.

Adeegayaasha barbar socdaa waxay ku habboon yihiin kiisaska codsi kastaa uu waqti badan ku qaato socodsiinta, ama halka macmiilka iyo serferka ay ku hawlan yihiin isdhaafsiga fariimaha dhaadheer. Cutubkan, waxaanu inta badan diiradda saari doonaa habka soo jireenka ah (iyo ugu fudud) ee naqshadaynta server-yada barbar socda, kaas oo ah in loo abuuro hannaan u gaar ah ilmaha macmiil kasta oo cusub. Habkani wuxuu fuliyaa dhammaan shaqada si loogu adeego macmiilka ka dibna wuu dhammaanayaa. Sababtoo ah mid kasta oo ka mid ah hababkani waxay u shaqeeyaan si madaxbannaan, macaamiil badan ayaa loo adeegi karaa isku mar. Hawsha ugu weyn ee habka server-ka (waalidku) waa in la abuuro ilmo gaar ah macmiil kasta oo cusub (Beddel ahaan, dunta fulinta ayaa la abuuri karaa halkii habraacyada).

Qaybaha soo socda, waxaan ku eegi doonaa tusaalayaal soo noqnoqda iyo isbarbar yaaca xayndaabyada xayndaabka xayndaabka internetka. Labadan adeege waxay hirgeliyaan nooca la fududeeyey ee adeegga echo (RFC 862), kaas oo soo celinaya nuqulka farriin kasta oo macmiilku u soo diro.

Isku xirka UDP server-ka

Qaybtan iyo qaybta xigta waxaan ku soo bandhigi doonaa server-yada adeegga echo. Waxay ku jirtaa lambarka dekedda 7 waxayna ka shaqeysaa UDP iyo TCP labadaba (dekeddan waa la xafiday, sidaas darteed server-ka echo waa in lagu maamulaa mudnaanta maamulka).

Seerfarka echo UDP wuxuu si joogto ah u akhriyaa xog-garaamyada wuxuuna u soo celiyaa nuqullo iyaga ka mid ah soo diraha. Mar haddii seerfarku u baahan yahay in uu hal farriin mar keliya farsameeyo, qaab-dhismeedka soo noqnoqda ayaa ku filnaan doona. Faylka madaxa ee adeegayaasha waxa lagu muujiyay Liiska 56.1.

Liiska 56.1. Faylka madaxa ee barnaamijyada id_echo_sv.c iyo id_echo_cl.c

#waxaa ku jira "inet_sockets.h" /* Wuxuu caddeeyaa shaqooyinka godkayaga */
#ku dar "tlpi_hdr.h"

#qeex SERVICE "echo" /* Magaca adeegga UDP */

# qeex BUF_SIZE 500 /* Cabbirka ugu badan ee xog-garaafyada kaas
waxaa akhrin kara macmiilka iyo serverka */
__________________________________________________Sockets/id_echo.h

Liistada 56.2 waxay muujinaysaa hirgelinta serverka. Qodobada soo socda ayaa mudan in la xuso:

  • Si loo dhigo server-ka qaabka daemon, waxaan isticmaalnaa shaqada noqotaaDaemon () ee qaybta 37.2;

  • Si aanu barnaamijka uga dhigno mid cufan, waxaan u isticmaalnaa maktabadda si aan ugala shaqayno saldhigyada xayndaabka internetka, ee lagu sameeyay qaybta 55.12;

  • Haddii server-ku uusan u soo celin karin jawaabaha macmiilka, wuxuu u qoraa fariin log isagoo isticmaalaya syslog() call.

Codsiga dhabta ah, waxay u badan tahay inaan ku soo rogi karno xoogaa xaddidan inta jeer ee fariimaha qorista iyadoo la adeegsanayo syslog(). Tani waxay meesha ka saari doontaa suurtagalnimada weeraryahan ku qulqulaya nidaamka nidaamka. Intaa waxaa dheer, ha iloobin in wicista syslog () ay aad qaali u tahay, maadaama ay u isticmaasho fsync () si caadi ah.

Liiska 56.2. Serfarka soo noqnoqda ee fuliya adeega Echo ee UDP

__________________________________________________ sockets/id_echo_sv.c
#ku dar
#ku dar "id_echo.h"
#ku dar "noqon_daemon.h"

INT
ugu weyn (int argc, char *argv[])
{
int sfd;
size_t numRead;
len-socklen_t;
qaabaysan sockaddr_claddr kaydinta;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

haddii (noqotoDaemon(0) == -1)
ErrExit ("noqonDaemon");

sfd = inetBind (Adeeg, SOCK_DGRAM, NULL);
haddii (sfd == -1) {
syslog (LOG_ERR, "Ma abuuri karo godka serverka (%s)",
qallafsanaan (errno));
bixi (EXIT_FAILURE);

/* Hel xog-garaamyada oo u soo celi nuqullo iyaga ka mid ah kuwa soo diray */
}
loogu talagalay (;;) {
len = cabbirka (qaabdhismeedka sockaddr_storage);
numRead = recvfrom (sfd, buf, BUF_SIZE, 0, (qaabdhismeedka sockaddr *) & claddr, &len);

haddii (numRead == -1)
ErrExit("recvfrom");
haddii ( dirto (sfd, buf, numRead, 0, (qaabdhismeedka sockaddr *) & claddr, len)
!= numRead)
syslog (LOG_WARNING, "Cilaad ku celcelinta jawaabta %s (%s)",
inetAddressStr ((dhismeed sockaddr *) & claddr, len,
addrStr, IS_ADDR_STR_LEN),
qallafsanaan (errno));
}
}
__________________________________________________ sockets/id_echo_sv.c

Si loo tijaabiyo shaqada serverka, waxaan isticmaalnaa barnaamijka liiska 56.3. Waxa kale oo ay u isticmaashaa maktabadda si ay ula shaqeyso saldhigyada xayndaabka internetka, ee lagu sameeyay qaybta 55.12. Sida doodda khadka taliska ugu horreysa, barnaamijka macmiilku wuxuu qaadanayaa magaca noodhka shabakadda kaas oo uu ku yaal server-ka. Macmiilku waxa uu galaa wareeg ah halkaas oo uu mid kasta oo ka mid ah doodaha soo hadhay u soo diro server-ka si uu u noqdo xog-ururin gooni ah, ka dibna akhriyo oo daabaco xogta uu ka helayo server-ka isagoo ka jawaabaya.

Liiska 56.3. Macmiilka UDP adeegga echo

#ku dar "id_echo.h"

INT
ugu weyn (int argc, char *argv[])
{
int sfd, j;
leniska size_t;
size_t numRead;
char buf[BUF_SIZE];

haddii (argc <2 || strcmp (argv[1], "-caawin") == 0)
usageErr("%s host msg…n", argv[0]);

/* Samee ciwaanka serverka iyadoo lagu salaynayo doodda xariiqda taliska ugu horeysa */
sfd = inetConnect (argv [1], SERVICE, SOCK_DGRAM);
haddii (sfd == -1)
dilaa ("Lama xidhi karo godka serverka");

/* U dir doodaha soo haray server-ka qaab datagrams gaar ah */
loogu talagalay (j = 2; j < argc; j++) {
len = strlen (argv [j]);
haddii (qor (sfd, argv[j], len) != len)
dilaa ("qoraal qayb ka mid ah/ guuldareystay");

numRead = akhri (sfd, buf, BUF_SIZE);
haddii (numRead == -1)
ErrExit ("akhri");
printf ("[% ld bytes] %.*sn", (dheer) numRead, (int) numRead, buf);
}
bixitaan (EXIT_SUCCESS);
}
__________________________________________________ sockets/id_echo_cl.c

Hoos waxaa ku qoran tusaale ah waxa aan arki doono marka la wado server-ka iyo laba tusaale oo macmiil ah:

$su // Mudnaanta ayaa looga baahan yahay in lagu xidho deked gaar ah
Password:
# ./id_echo_sv // Server-ku waxa uu galaa qaabka asalka
# bixitaan // Iska dhaaf xuquuqda maamulka
$ ./id_echo_cl localhost hello world // Macmiilkani wuxuu soo diraa laba xog-garaam
[5 bytes] hello // Macmiilku wuxuu soo bandhigayaa jawaabta laga helay server-ka
[5 bytes] adduunka
$ ./id_echo_cl localhost nabad galyo // Macmiilkani waxa uu soo diraa hal datagram
[7 bytes] nabad gelyo

Waxaan kuu rajeynayaa akhris wacan)

Source: linux.org.ru