Pukapuka "Linux API. Aratohu Matawhānui"


Pukapuka "Linux API. Aratohu Matawhānui"

Kia pai te ahiahi Ka whakaatu ahau ki a koe te pukapuka "Linux API. He aratohu whanui" (whakamaoritanga o te pukapuka Ko te Atanga Papatono Linux). Ka taea te tono i runga i te paetukutuku a te kaiwhakaputa, a ki te tono koe i te waehere whakatairanga LinuxAPI , ka whiwhi koe i te 30% hekenga.

Pukapuka mai i te pukapuka hei tohutoro:

Nga turanga: Hangahanga Tūmau

I roto i tenei upoko, ka matapakihia e tatou nga tikanga o te hoahoa i nga kaitoro me te whakarara, me te titiro ano hoki ki tetahi daemon motuhake e kiia nei ko inetd, he maamaa ake te hanga i nga tono tūmau Ipurangi.

Tūmau tukurua me te whakarara

E rua nga hoahoanga tuunga whatunga-a-tupapa noa:

  • tukurua: ka mahi te tūmau ki nga kiritaki kotahi i ia wa, ka tukatuka tuatahi i tetahi tono (he maha nga tono) mai i tetahi kaihoko ka neke ki tera atu;

  • whakarara: kua hoahoatia te tūmau ki te mahi i nga kiritaki maha i te wa kotahi.

Ko tetahi tauira o te tūmau whiti i runga i nga rarangi FIFO kua whakaatuhia i te Wāhanga 44.8.

Ko te nuinga o nga wa e tika ana nga kaitoro tukurua i nga waahi ka taea te tukatuka tere i nga tono a nga kaihoko, na te mea ka pehia ia kaihoko ki te tatari kia tukuna atu etahi atu kaihoko i mua. Ko tetahi take whakamahi noa mo tenei huarahi ko te whakawhiti i nga tono kotahi me nga whakautu i waenga i te kaihoko me te tūmau.

He pai nga kaitoro whakarara i roto i nga keehi ka nui te wa o ia tono ki te tukatuka, ki te waahi ranei te kaihoko me te tūmau ki te whakawhiti karere roa. I roto i tenei upoko, ka aro nui tatou ki te tikanga tuku iho (me te ngawari) mo te hoahoa i nga tuunga whakarara, ara ko te hanga i tetahi tukanga tamariki motuhake mo ia kiritaki hou. Ka mahia e tenei tukanga nga mahi katoa ki te mahi ki te kaihoko ka mutu. Na te mea ka mahi takitahi enei mahinga, ka taea te mahi ki nga kaihoko maha i te wa kotahi. Ko te mahi matua o te tukanga tūmau matua (maatua) ko te hanga i tetahi tamaiti motuhake mo ia kiritaki hou (he rereke, ka taea te hanga miro o te mahi hei utu mo nga tukanga).

I roto i nga waahanga e whai ake nei, ka titiro tatou ki nga tauira o nga tuunga turanga ipurangi mo nga waahi ipurangi whakarara. Ka whakatinanahia e enei tūmau e rua he putanga ngawari o te ratonga paoro (RFC 862), e whakahoki ana i te kape o nga karere ka tukuna atu e tetahi kaihoko.

Paoro te tūmau UDP

I tenei waahanga me te waahanga e whai ake nei ka whakauruhia e matou nga kaitoro mo te ratonga echo. E wātea ana i runga i te tau tauranga 7 me te mahi i runga i te UDP me te TCP (kua rahuitia tenei tauranga, na reira me whakahaere te tūmau paoro me nga mana whakahaere).

Ka panui tonu te tūmau UDP echo i nga kararamatanga me te whakahoki i nga kape ki te kaituku. I te mea me mahi kotahi te karere i te wa kotahi, ka rato te hoahoanga. Ko te konae pane mo nga kaitoro e whakaatuhia ana i te Rarangi 56.1.

Rarangi 56.1. Kōnae pane mō ngā papatono id_echo_sv.c me id_echo_cl.c

#include "inet_sockets.h" /* Whakapuakihia a maatau mahi turanga */
#include "tlpi_hdr.h"

#define RATONGA "echo" /* ingoa ratonga UDP */

#define BUF_SIZE 500 /* Te rahinga teitei o nga kararamatanga raraunga
Ka taea te panui e te kiritaki me te tūmau */
_____________________________________________________________________nga turanga/id_echo.h

Ko te rarangi 56.2 e whakaatu ana i te whakatinanatanga o te tūmau. Ko nga mea e whai ake nei he mea tika kia mahara:

  • ki te whakauru i te tūmau ki te aratau daemon, ka whakamahia e matou te mahi riroDaemon() mai i te waahanga 37.2;

  • kia pai ake te hangai o te hotaka, ka whakamahia e matou te whare pukapuka mo te mahi me nga turanga rohe Ipurangi, i whakawhanakehia i te waahanga 55.12;

  • ki te kore e taea e te tūmau te whakahoki urupare ki te kiritaki, ka tuhia e ia he karere ki te rangitaki ma te whakamahi i te syslog() waea.

I roto i te tino tono, ka whakatauhia e matou etahi rohe ki runga i te auau o nga karere takiuru ma te whakamahi i te syslog(). Ma tenei ka whakakore i te tupono ka kapi te kaitukino i te raarangi punaha. I tua atu, kaua e wareware ko ia waea ki te syslog() he tino utu, na te mea ka whakamahia te fsync() ma te taunoa.

Rarangi 56.2. Tūmau tukurua e whakatinana ana i te ratonga paoro UDP

_________________________________________________________________nga turanga/id_echo_sv.c
#whakauru
#include "id_echo.h"
#include "become_daemon.h"

int
matua(int argc, char *argv[])
{
int sfd;
ssize_t numPānui;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

ki te (becomeDaemon(0) == -1)
errExit("BecomeDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
mehemea (sfd == -1) {
syslog(LOG_ERR, "Kāore i taea te hanga turanga tūmau (%s)",
strerror(errno));
puta(EXIT_FAILURE);

/* Whakawhiwhia nga raraunga me te whakahoki i nga kape ki nga kaituku */
}
mo (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

ki te (numPānui == -1)
errExit("recvfrom");
ki te (tuku(sfd, buf, numRead, 0, (hanganga sockaddr *) &claddr, len)
!= numPānui)
syslog(LOG_WARNING, "Hapa te paoro whakautu ki %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________nga turanga/id_echo_sv.c

Hei whakamatautau i te mahi a te tūmau, ka whakamahia e matou te papatono mai i te Rarangi 56.3. Ka whakamahia ano e ia te whare pukapuka mo te mahi me nga turanga rohe Ipurangi, i whakawhanakehia i te waahanga 55.12. Hei tohenga rarangi whakahau tuatahi, ka tangohia e te papatono kiritaki te ingoa o te node whatunga kei reira te tūmau. Ka kuhu te kiritaki ki te kopae ka tukuna ia o nga tohenga e toe ana ki te tūmau hei kararamatanga motuhake, ka panuihia, ka taia nga kararamatanga ka riro mai i te tūmau hei whakautu.

Rarangi 56.3. Kiritaki mo te ratonga paoro UDP

#include "id_echo.h"

int
matua(int argc, char *argv[])
{
int sfd, j;
rahi_t len;
ssize_t numPānui;
char buf[BUF_SIZE];

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

/* Hangaia te wahitau tūmau i runga i te tohenga rārangi whakahau tuatahi */
sfd = inetConnect(argv[1], RATONGA, SOCK_DGRAM);
mena (sfd == -1)
fatal("Kaore i taea te hono ki te turanga tūmau");

/* Tukuna atu nga tohenga e toe ana ki te tūmau i roto i te ahua o nga tohu raraunga motuhake */
mo (j = 2; j < argc; j++) {
len = strlen(argv[j]);
mena (tuhia(sfd, argv[j], len) != len)
fatal("tuhinga wahanga/rahua");

numRead = panui(sfd, buf, BUF_SIZE);
ki te (numPānui == -1)
errExit("panui");
printf("[%ld bytes] %.*sn", (roa) numRead, (int) numRead, buf);
}
puta(EXIT_SUCCESS);
}
_________________________________________________________________nga turanga/id_echo_cl.c

Kei raro nei he tauira o nga mea ka kitea e matou i te wa e whakahaere ana i te tūmau me nga tauira kiritaki e rua:

$su // Me whai mana ki te here ki tetahi tauranga kua rahuitia
Kupuhipa:
# ./id_echo_sv // Ka uru te tūmau ki te aratau papamuri
# exit // Tukua te mana kaiwhakahaere
$ ./id_echo_cl localhost kia ora te ao // Ka tukuna e tenei kaihoko nga tohu raraunga e rua
[5 paita] kia ora // Ka whakaatu te kiritaki i te whakautu mai i te tūmau
[5 paita] ao
$ ./id_echo_cl localhost poroporoaki // Ka tukuna e tenei kiritaki tetahi tohu raraunga
[7 paita] poroporoaki

Ko taku hiahia kia pai to panui)

Source: linux.org.ru