Buku "Linux API. Comprehensive Guide"


Buku "Linux API. Comprehensive Guide"

Masana abwino Ndikukuwonetsani buku la "Linux API. A Comprehensive Guide" (kumasulira kwa bukhuli Linux Programming Interface). Itha kuyitanidwa patsamba la osindikiza, ndipo ngati mugwiritsa ntchito nambala yotsatsira LinuxAPI , mudzalandira kuchotsera 30%.

Kufotokozera m'bukuli:

Sockets: Zomangamanga za Seva

M'mutu uno, tikambirana zofunikira pakupanga ma seva obwerezabwereza komanso ofanana, komanso kuyang'ana pa daemon yapadera yotchedwa inetd, yomwe imapangitsa kuti zikhale zosavuta kupanga mapulogalamu a seva ya intaneti.

Ma seva obwerezabwereza komanso ofanana

Pali mitundu iwiri yodziwika bwino ya socket-based network server:

  • iterative: seva imatumikira makasitomala nthawi imodzi, choyamba kukonza pempho (kapena zopempha zingapo) kuchokera kwa kasitomala mmodzi ndiyeno kupita ku yotsatira;

  • kufanana: seva idapangidwa kuti izithandizira makasitomala angapo nthawi imodzi.

Chitsanzo cha seva yobwerezabwereza yotengera mizere ya FIFO idaperekedwa kale mu Gawo 44.8.

Ma seva obwereza nthawi zambiri amakhala oyenera pokhapokha ngati zopempha zamakasitomala zitha kukonzedwa mwachangu, chifukwa kasitomala aliyense amakakamizika kudikirira mpaka makasitomala ena onse patsogolo pake atumizidwa. Njira yodziwika yogwiritsira ntchito njirayi ndikusinthana kwa pempho limodzi ndi mayankho pakati pa kasitomala ndi seva.

Ma seva ofananira ndi oyenera pazochitika zomwe pempho lililonse limatenga nthawi yayitali kuti likonze, kapena pomwe kasitomala ndi seva amagawana mauthenga aatali. M'mutu uno, tiwona makamaka njira yachikhalidwe (komanso yosavuta) yopangira ma seva ofanana, omwe ndi kupanga njira yosiyana ya ana kwa kasitomala watsopano aliyense. Njirayi imagwira ntchito yonse yotumikira kasitomala kenako imatha. Chifukwa chilichonse mwa njirazi chimagwira ntchito palokha, ndizotheka kutumikira makasitomala angapo nthawi imodzi. Ntchito yayikulu ya njira yayikulu ya seva (kholo) ndikupanga mwana wosiyana kwa kasitomala aliyense watsopano (mwinanso, ulusi wakupha ukhoza kupangidwa m'malo mwa njira).

M'magawo otsatirawa, tiwona zitsanzo za ma seva obwerezabwereza komanso ofanana pa intaneti. Ma seva awiriwa amagwiritsa ntchito mtundu wosavuta wa ntchito ya echo (RFC 862), yomwe imabweza uthenga uliwonse womwe kasitomala amatumiza kwa iwo.

Kubwereza kwa seva ya UDP

Mu gawo ili ndi lotsatira tikuwonetsa ma seva a ntchito ya echo. Imapezeka pa doko nambala 7 ndipo imagwira ntchito pa UDP ndi TCP (dokoli ndi losungidwa, chifukwa chake seva ya echo iyenera kuyendetsedwa ndi mwayi wotsogolera).

Seva ya echo UDP imawerengera mosalekeza ma datagraphs ndikubweza makope awo kwa wotumiza. Popeza seva imangofunika kukonza uthenga umodzi panthawi imodzi, zomangamanga zobwerezabwereza zidzakwanira. Fayilo yamutu yamaseva ikuwonetsedwa pamndandanda 56.1.

Listing 56.1. Fayilo yam'mutu yamapulogalamu id_echo_sv.c ndi id_echo_cl.c

#kuphatikizapo "inet_sockets.h" /* Imalengeza ntchito zathu zoyambira */
#kuphatikizapo "tlpi_hdr.h"

#define SERVICE "echo" /* dzina lautumiki la UDP */

#tanthauzirani BUF_SIZE 500 /* Kukula kwakukulu kwa ma datagram omwe
ikhoza kuwerengedwa ndi kasitomala ndi seva */
_____________________________________________________________________________________mo/id_echo.h

Mndandanda wa 56.2 ukuwonetsa kukhazikitsidwa kwa seva. Mfundo zotsatirazi ndi zofunika kuziganizira:

  • kuyika seva mu daemon mode, timagwiritsa ntchito becomeDaemon () ntchito kuchokera ku gawo 37.2;

  • kuti pulogalamuyo ikhale yaying'ono, timagwiritsa ntchito laibulale pogwira ntchito ndi sockets ya intaneti, yopangidwa mu gawo 55.12;

  • ngati seva silingathe kubwezera yankho kwa kasitomala, imalemba uthenga ku chipikacho pogwiritsa ntchito syslog () call.

Mukugwiritsa ntchito kwenikweni, titha kuyika malire pa kuchuluka kwa mauthenga odula mitengo pogwiritsa ntchito syslog(). Izi zitha kuthetsa kuthekera kwa wowukirayo kusefukira pa chipika chadongosolo. Kuphatikiza apo, musaiwale kuti kuyimba kulikonse ku syslog () ndikokwera mtengo, chifukwa kumagwiritsa ntchito fsync () mwachisawawa.

Listing 56.2. Seva yobwereza yomwe imagwiritsa ntchito UDP echo service

________________________________________________________________________________malo/id_echo_sv.c
#kuphatikizapo
#kuphatikizapo "id_echo.h"
#kuphatikizapo "become_daemon.h"

Int
chachikulu (int argc, char *argv[])
{
int sfd;
size_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

ngati (kukhalaDaemon(0) == -1)
errExit ("becomeDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
ngati (sfd == -1) {
syslog(LOG_ERR, "Sindinathe kupanga socket ya seva (%s)",
strerror (errno));
kutuluka (EXIT_FAILURE);

/* Landirani ma datagraph ndikubweza makope awo kwa omwe akutumiza */
}
za (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

ngati (nambalaRead == -1)
errExit ("recvfrom");
ngati (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "Zolakwika pakuyankha kwa %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror (errno));
}
}
________________________________________________________________________________malo/id_echo_sv.c

Kuti tiyese ntchito ya seva, timagwiritsa ntchito pulogalamu kuchokera pa Listing 56.3. Imagwiritsanso ntchito laibulale pogwira ntchito ndi ma sockets a intaneti, opangidwa mu gawo 55.12. Monga mkangano woyamba wa mzere wolamula, pulogalamu ya kasitomala imatenga dzina la node ya netiweki yomwe seva ili. Wothandizira amalowa m'chiuno pomwe amatumiza mfundo zotsalira ku seva monga datagrams payekha, ndiyeno amawerenga ndi kusindikiza ma datagrams omwe amalandira kuchokera ku seva poyankha.

Listing 56.3. Makasitomala a UDP echo service

#kuphatikizapo "id_echo.h"

Int
chachikulu (int argc, char *argv[])
{
int sfd, j;
size_t len;
size_t numRead;
char buf[BUF_SIZE];

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

/* Pangani adilesi ya seva potengera mkangano woyamba wa mzere */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
ngati (sfd == -1)
fatal ("Sindinathe kulumikiza ku socket ya seva");

/* Tumizani zotsalira zotsalira kwa seva ngati mawonekedwe a datagrams */
kwa (j = 2; j <argc; j++) {
len = strlen(argv[j]);
ngati (lembani(sfd, argv[j], len) != len)
kufa ("kulemba pang'ono/kulephera kulemba");

numRead = read(sfd, buf, BUF_SIZE);
ngati (nambalaRead == -1)
errExit ("werengani");
printf("[%ld bytes] %.*sn", (kutalika) numRead, (int) numRead, buf);
}
kutuluka (EXIT_SUCCESS);
}
________________________________________________________________________________malo/id_echo_cl.c

Pansipa pali chitsanzo cha zomwe tiwona tikamayendetsa seva ndi zochitika ziwiri za kasitomala:

$su // Mwayi umafunika kumangirira ku doko losungidwa
achinsinsi:
# ./id_echo_sv // Seva imapita kumayendedwe akumbuyo
# tulukani // Perekani ufulu woyang'anira
$ ./id_echo_cl localhost moni dziko // Makasitomala uyu amatumiza ma datagram awiri
[5 bytes] moni // Makasitomala akuwonetsa yankho lomwe adalandira kuchokera ku seva
[5 bytes] dziko
$ ./id_echo_cl localhost goodbye // Makasitomala uyu amatumiza datagram imodzi
[7 bytes] chabwino

Ndikufunirani kuwerenga kosangalatsa)

Source: linux.org.ru