Tusi “Linux API. Ta'iala Atoa"


Tusi “Linux API. Ta'iala Atoa"

Manuia le aoauli Ou te tuʻuina atu ia te oe le tusi "Linux API. O se taiala atoatoa” (faaliliuga o le tusi Le Linux Polokalama Fa'afeso'ota'i). E mafai ona faʻatonuina i luga o le upega tafaʻilagi a le tagata lomitusi, ma afai e te faʻaogaina le code faʻalauiloa LinuxAPI , o le ae mauaina se 30% fa'aitiitiga.

Fuaitau mai le tusi mo faʻamatalaga:

Sockets: Faiga Fa'atonu

I totonu o lenei mataupu, o le a tatou talanoaina faʻavae autu o le faʻatulagaina o faʻaumau faʻasolosolo ma tutusa, ma vaʻavaʻai foi i se daemon faʻapitoa e taʻua o le inetd, lea e faafaigofie ai le fatuina o talosaga a le Initaneti.

Au'aunaga faifai pea ma tutusa

E lua fa'asologa masani o feso'ota'iga feso'ota'iga e fa'avae socket:

  • fa'aauau: e tautuaina e le 'au'aunaga ta'itasi i le taimi, fa'agasolo muamua se talosaga (po'o nisi talosaga) mai le tasi tagata fa'atau ona fa'asolosolo atu lea i le isi;

  • tutusa: ua mamanuina le server e tautuaina le tele o tagata i le taimi e tasi.

O se fa'ata'ita'iga o se 'au'aunaga fa'ata'ita'i e fa'atatau i laina FIFO ua uma ona tu'uina atu i le Vaega 44.8.

E masani lava e na'o le talafeagai o 'au'aunaga faifai pea i tulaga e mafai ai ona vave fa'agaoioia talosaga a tagata o tausia, talu ai e fa'amalosi tagata ta'itasi e fa'atali se'ia uma ona tu'uina atu isi tagata fa'atau i luma. O se fa'aoga masani mo lenei faiga o le fa'afesuia'i o talosaga e tasi ma tali i le va o le kalani ma le 'au'aunaga.

O lo'o talafeagai 'au'aunaga fa'atutusa i tulaga e mana'omia ai e talosaga ta'itasi se taimi tele e fa'agasolo ai, po'o le mea o lo'o fa'agaoioi ai le kalani ma le 'au'aunaga i fefa'ataua'iga umi. I totonu o lenei mataupu, o le a tatou taulai atu i le auala masani (ma sili ona faigofie) o le mamanuina o sapalai tutusa, o le fatuina lea o se faiga e ese ai tamaiti mo tagata fou taitasi. O lenei faiga e fa'atino uma ai galuega e tautua ai le kalani ona fa'auma ai lea. Talu ai ona o nei faiga ta'itasi e fa'agaoioia tutoatasi, e mafai ona tautuaina le tele o tagata fa'atau i le taimi e tasi. O le galuega autu o le faagasologa autu o le server (matua) o le fatuina lea o se tamaititi ese mo tagata fou taʻitasi (i le isi itu, e mafai ona faia ni filo o le faʻatinoga nai lo faiga).

I vaega o loʻo mulimuli mai, o le a tatou vaʻavaʻai i faʻataʻitaʻiga o sapalai socket socket domain ma tutusa i luga ole laiga. O nei 'au'aunaga e lua o lo'o fa'atinoina se fa'amatalaga faigofie o le 'au'aunaga fa'alogo (RFC 862), lea e toe fa'afo'i mai ai se kopi o so'o se fe'au na lafo i ai e le tagata o tausia.

Si'uleo le server UDP faifai pea

I lenei ma le isi vaega o le a matou faʻalauiloaina le 'auʻaunaga mo le auaunaga faʻalogo. E maua i luga o le taulaga numera 7 ma galue i luga uma o le UDP ma le TCP (o lenei uafu ua faʻaagaga, ma o le mea lea e tatau ai ona faʻatautaia le server echo ma avanoa faʻapitoa).

O lo'o fa'aauau pea ona faitau e le 'au'aunaga UDP fa'amaumauga ma toe fa'afo'i atu kopi o latou i le tagata e auina atu. Talu ai e na'o le 'au'aunaga e mana'omia le fa'agaioia o le fe'au e tasi i le taimi, o le a lava le fausaga fa'asolosolo. O le faila faila mo 'auʻaunaga o loʻo faʻaalia ile Lisi 56.1.

Lisi 56.1. Ulutala faila mo polokalame id_echo_sv.c ma id_echo_cl.c

#include "inet_sockets.h" /* Fa'ailoa galuega a la tatou socket */
#include "tlpi_hdr.h"

#define SERVICE "echo" /* UDP igoa tautua */

#define BUF_SIZE 500 /* Ole maualuga ole lapo'a o fa'amaumauga e
e mafai ona faitau e le kalani ma le server */
________________________________________________________________________sockets/id_echo.h

Lisi 56.2 o loʻo faʻaalia ai le faʻatinoina o le server. O mea nei e tatau ona matauina:

  • e tuʻu le 'auʻaunaga i totonu o le daemon mode, matou te faʻaogaina le avea maDaemon() galuega mai le vaega 37.2;

  • ina ia fa'afaigofieina le polokalame, matou te fa'aogaina le faletusi mo le galulue fa'atasi ai ma sockets fa'ainitaneti, fausia i le vaega 55.12;

  • afai e le mafai e le 'auʻaunaga ona toe faʻafoʻi se tali i le kalani, na te tusia se feʻau i le ogalaau e faʻaaoga ai le syslog() valaau.

I se talosaga moni, matou te ono tuʻuina atu se tapulaʻa i luga o le tele o feʻau tusitusia e faʻaaoga ai le syslog(). Ole mea lea ole a fa'ate'ia ai le avanoa e sosolo ai e se tagata osofa'i le log system. E le gata i lea, aua nei galo o valaau taʻitasi i syslog() e taugata tele, talu ai e faʻaaogaina fsync() e ala i le faaletonu.

Lisi 56.2. O lo'o fa'atinoina le UDP echo service

_________________________________________________________________sockets/id_echo_sv.c
#fa'aofia
#include "id_echo.h"
#include "become_daemon.h"

int
autu(int argc, char *argv[])
{
int sfd;
ssize_t num Faitau;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

pe a fai (becomeDaemon(0) == -1)
errExit("become Daemon");

sfd = inetBind(AUAUNA, SOCK_DGRAM, NULL);
afai (sfd == -1) {
syslog(LOG_ERR, "Ua le mafai ona fai socket server (%s)",
strerror(errno));
alu ese(EXIT_FAILURE);

/* Maua faʻamaumauga ma toe faʻafoʻi kopi o latou i le au lafo */
}
mo (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

afai (numRead == -1)
errExit("recvfrom");
afai (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numera Faitau)
syslog(LOG_WARNING, "Sese i le fa'alogoina o tali i %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c

Ina ia faʻataʻitaʻiina le faʻagaioiga a le 'auʻaunaga, matou te faʻaogaina le polokalame mai le Listing 56.3. O lo'o fa'aogaina fo'i le faletusi mo le galulue fa'atasi ma sockets i luga ole Initaneti, fa'atupuina ile vaega 55.12. I le avea ai ma finauga muamua o le laina o le poloaiga, o le polokalama o le kalani e ave le igoa o le node fesoʻotaʻiga o loʻo i ai le server. E ulufale le tagata o tausia i se matasele e lafo atu ai finauga ta'itasi o totoe i le 'au'aunaga o ni fa'amatalaga tu'ufa'atasi, ona faitau lea ma lolomi fa'amaumauga na te maua mai le 'au'aunaga e tali atu ai.

Lisi 56.3. Tagata fa'atau mo le UDP echo service

#include "id_echo.h"

int
autu(int argc, char *argv[])
{
int sfd, j;
size_t len;
ssize_t num Faitau;
char buf[BUF_SIZE];

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

/* Fausia le tuatusi server e faʻavae i luga o le finauga muamua laina laina */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
afai (sfd == -1)
fatal("E le mafai ona feso'ota'i i le socket server");

/* Auina atu finauga o lo'o totoe i le 'au'aunaga i tulaga o fa'amaumauga eseese */
mo (j = 2; j < argc; j++) {
len = strlen(argv[j]);
afai (tusi(sfd, argv[j], len) != len)
fatal("fa'ailoga/fa'aletonu le tusitusi");

numRead = faitau(sfd, buf, BUF_SIZE);
afai (numRead == -1)
errExit("faitau");
printf("[%ld bytes] %.*sn", (umi) numRead, (int) numRead, buf);
}
alu ese(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

O loʻo i lalo se faʻataʻitaʻiga o mea o le a tatou vaʻaia pe a faʻatautaia le server ma faʻataʻitaʻiga e lua o tagata faʻatau:

$su // E mana'omia ni fa'amanuiaga e fusifusia ai i se uafu fa'aagaga
Numera e le iloa e sesi:
# ./id_echo_sv // O lo'o alu le 'au'aunaga i tua
# exit // Tu'u ai aia tatau a le pule
$ ./id_echo_cl localhost hello world // E auina atu e le tagata o tausia ni ata se lua
[5 bytes] talofa // E fa'aalia e le kalani le tali na maua mai le 'au'aunaga
[5 paita] lalolagi
$ ./id_echo_cl localhost tofa // E auina atu e le tagata fa'atau se tasi fa'amaumauga
[7 bytes] tofa

Ou te moomoo ia te oe se faitauga fiafia)

puna: linux.org.ru