Littafin "Linux API. Cikakken Jagora"


Littafin "Linux API. Cikakken Jagora"

Barka da rana Ina gabatar muku da littafin “Linux API. Cikakken jagora" (fassarar littafin Interface Programming na Linux). Ana iya yin oda akan gidan yanar gizon mai wallafa, kuma idan kun yi amfani da lambar talla LinuxAPI , za ku sami rangwame 30%.

Cire daga littafin don yin tunani:

Sockets: Sabar Gine-gine

A wannan babin, zamu tattauna kayan yau da kullun na ƙirar shayarwa da na layi daya da ake kira Inetd, wanda ya sauƙaƙa amfani da aikace-aikacen uwar garken intanet.

Iterative da parallel servers

Akwai gine-gine na cibiyar sadarwa na tushen soket guda biyu:

  • maimaitawa: uwar garken yana ba abokan ciniki hidima ɗaya bayan ɗaya, fara aiwatar da buƙatun (ko buƙatun da yawa) daga abokin ciniki ɗaya sannan kuma matsawa zuwa na gaba;

  • a layi daya: an tsara uwar garken don yin hidima ga abokan ciniki da yawa lokaci guda.

An riga an gabatar da misalin sabar sabar mai jujjuyawa bisa layukan FIFO a Sashe na 44.8.

Sabbin sabobin yawanci suna dacewa ne kawai a yanayin da ake iya sarrafa buƙatun abokin ciniki cikin sauri, tunda kowane abokin ciniki ana tilastawa ya jira har sai an ba da sabis na kowane abokin ciniki a gabansa. Halin amfani gama gari don wannan hanya shine musayar buƙatu ɗaya da martani tsakanin abokin ciniki da uwar garken.

Sabar masu daidaitawa sun dace a lokuta inda kowace buƙata ta ɗauki lokaci mai yawa don aiwatarwa, ko kuma inda abokin ciniki da uwar garken ke shiga cikin dogon saƙo. A cikin wannan babi, za mu fi mai da hankali kan al'ada (kuma mafi sauƙi) hanyar zayyana sabobin layi ɗaya, wanda shine ƙirƙirar tsarin yara daban ga kowane sabon abokin ciniki. Wannan tsari yana yin duk aikin don bauta wa abokin ciniki sannan ya ƙare. Saboda kowane ɗayan waɗannan hanyoyin yana aiki da kansa, yana yiwuwa a yi hidima ga abokan ciniki da yawa lokaci guda. Babban aikin babban tsarin uwar garken (iyaye) shine ƙirƙirar ɗa daban ga kowane sabon abokin ciniki (a madadin, zaren aiwatarwa za a iya ƙirƙirar maimakon matakai).

A cikin sassan da ke gaba, za mu kalli misalan sabar sabar yankin intanet mai jujjuyawa da layi daya. Waɗannan sabobin biyu suna aiwatar da sauƙaƙan nau'in sabis ɗin echo (RFC 862), wanda ke dawo da kwafin kowane saƙon da abokin ciniki ya aika masa.

Iterative UDP uwar garken echo

A cikin wannan da kuma sashe na gaba za mu gabatar da sabobin don sabis na echo. Yana samuwa akan lambar tashar tashar jiragen ruwa 7 kuma yana aiki akan duka UDP da TCP (wannan tashar jiragen ruwa an tanada, sabili da haka uwar garken echo dole ne a gudanar da shi tare da gata mai gudanarwa).

UDP uwar garken echo yana ci gaba da karanta bayanan bayanai kuma yana mayar da kwafin su ga mai aikawa. Tun da uwar garken yana buƙatar aiwatar da saƙo ɗaya kawai a lokaci ɗaya, ƙirar gine-ginen za ta ishi. Ana nuna fayil ɗin taken sabobin a cikin Lissafi 56.1.

Jerin 56.1. Fayil na kai don shirye-shirye id_echo_sv.c da id_echo_cl.c

#hada da "inet_sockets.h" /* Yana bayyana ayyukan soket din mu */
# hada da "tlpi_hdr.h"

# ayyana SERVICE "echo" /* sunan sabis na UDP */

# ayyana BUF_SIZE 500 /* Matsakaicin girman bayanai wanda
za a iya karanta ta abokin ciniki da uwar garken */
____________________________________________________sockets/id_echo.h

Jerin 56.2 yana nuna aiwatar da uwar garken. Ya kamata a lura da abubuwan da ke gaba:

  • don saka uwar garken cikin yanayin daemon, muna amfani da aikin zamaDaemon () daga sashin 37.2;

  • don ƙara ƙaddamar da shirin, muna amfani da ɗakin karatu don aiki tare da kwasfa na yanki na Intanet, wanda aka haɓaka a cikin sashe na 55.12;

  • idan uwar garken ba zai iya mayar da martani ga abokin ciniki ba, yana rubuta saƙo zuwa log ɗin ta amfani da kiran syslog().

A cikin ainihin aikace-aikacen, ƙila za mu iya sanya iyaka akan yawan saƙon shiga ta amfani da syslog(). Wannan zai kawar da yuwuwar maharin ya mamaye log ɗin tsarin. Bugu da kari, kar a manta cewa kowane kira zuwa syslog() yana da tsada sosai, tunda yana amfani da fsync () ta tsohuwa.

Jerin 56.2. uwar garken maimaitawa wanda ke aiwatar da sabis na amsawar UDP

_________________________________________________________________ sockets/id_echo_sv.c
#hada da
# hada da "id_echo.h"
#hada da "zama_daemon.h"

int
babban (int argc, char *argv[])
{
int sfd;
size_t numRead;
ruwan tabarau na socklen;
tsarin sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

idan (zamaDaemon (0) == -1)
errExit ("zamaDaemon");

sfd = inetBind (SERVICE, SOCK_DGRAM, NULL);
idan (sfd == -1) {
syslog(LOG_ERR, "Ba a iya ƙirƙirar soket ɗin uwar garke ba (%s)",
damuwa (kuskure));
fita(EXIT_FAILURE);

/* Karɓi bayanaigram kuma mayar da kwafin su ga masu aikawa */
}
za (;;) {
len = girman (tsarin sockaddr_storage);
numRead = recvfrom (sfd, buf, BUF_SIZE, 0, (tsarin sockaddr *) & claddr, &len);

idan (numRead == -1)
errExit("recvfrom");
idan (sendto (sfd, buf, numRead, 0, (tsarin sockaddr *) & claddr, len)
!= numRead)
syslog (LOG_WARNING, "Kuskuren amsa amsa ga %s (%s)",
inetAddressStr ((tsarin sockaddr *) & claddr, len,
addrStr, IS_ADDR_STR_LEN),
damuwa (kuskure));
}
}
_________________________________________________________________ sockets/id_echo_sv.c

Don gwada aikin uwar garken, muna amfani da shirin daga Lissafin 56.3. Hakanan yana amfani da ɗakin karatu don aiki tare da ramukan yankin Intanet, wanda aka haɓaka a sashe na 55.12. A matsayin hujjar layin umarni na farko, shirin abokin ciniki yana ɗaukar sunan kumburin hanyar sadarwa wanda uwar garken yake. Abokin ciniki yana shigar da madauki inda zai aika kowane ɗayan hukunce-hukuncen da suka rage zuwa uwar garken a matsayin daban-daban datagrams, sa'an nan kuma karanta da buga da datagrams da ya karba daga uwar garke a mayar da martani.

Jerin 56.3. Abokin ciniki don sabis na echo na UDP

# hada da "id_echo.h"

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

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

/* Samar da adireshin uwar garken bisa ga hujjar layin umarni na farko */
sfd = inetConnect (argv [1], SERVICE, SOCK_DGRAM);
idan (sfd == -1)
m ("Ba a iya haɗawa zuwa soket ɗin uwar garke");

/* Aika sauran gardama zuwa uwar garken a cikin nau'i na daban-daban datagrams */
don (j = 2; j < argc; j++) {
len = strlen (argv [j]);
idan (rubuta (sfd, argv [j], len)! = len)
m ("rubutu na ban sha'awa / gazawa");

numRead = karanta (sfd, buf, BUF_SIZE);
idan (numRead == -1)
errExit ("karanta");
printf ("[% ld bytes] %.*sn", (dogon) numRead, (int) numRead, buf);
}
fita(EXIT_SUCCESS);
}
_________________________________________________________________ sockets/id_echo_cl.c

Da ke ƙasa akwai misalin abin da za mu gani lokacin gudanar da uwar garken da misalin abokin ciniki guda biyu:

$su // Ana buƙatar gata don ɗaure zuwa tashar jiragen ruwa da aka keɓe
Kalmar wucewa:
# ./id_echo_sv // Sabar tana shiga yanayin bango
# fita // Bada haƙƙin gudanarwa
$ ./id_echo_cl localhost hello duniya // Wannan abokin ciniki yana aika bayanai guda biyu
[5 bytes] sannu // Abokin ciniki yana nuna martanin da aka karɓa daga uwar garken
[5 bytes] duniya
$ ./id_echo_cl localhost bankwana // Wannan abokin ciniki yana aika datagram ɗaya
[7 bytes] sannu

Ina yi muku kyakkyawan karatu)

source: linux.org.ru