Liv "Linux API. Gid konplè»


Liv "Linux API. Gid konplè»

Bon apremidi Mwen pote nan atansyon ou liv "Linux API. Gid konplè "(tradiksyon liv la Entèfas pwogramasyon Linux). Li ka kòmande sou sit entènèt Piblikatè a, epi si ou aplike kòd promo a LinuxAPI ou pral jwenn yon rabè 30%.

Yon ekstrè nan liv la pou revizyon:

Sockets: achitekti sèvè

Nan chapit sa a, nou pral diskite sou baz yo nan konsepsyon sèvè iteratif ak paralèl, osi byen ke yon daemon espesyal inetd ki fasilite kreyasyon aplikasyon entènèt bò sèvè.

Iterasyon ak sèvè paralèl

Gen de komen achitekti sèvè rezo ki baze sou priz:

  • iteratif: sèvè a sèvi kliyan youn nan yon moman, premye trete demann lan (oswa plizyè demann) nan yon kliyan epi answit deplase sou pwochen an;

  • paralèl: sèvè a fèt pou sèvi plizyè kliyan an menm tan.

Seksyon 44.8 te deja bay yon egzanp yon sèvè iterasyon ki baze sou keu FIFO.

Sèvè iterasyon yo anjeneral apwopriye sèlman nan sitiyasyon kote demann kliyan yo ka trete san patipri byen vit, kòm chak kliyan oblije rete tann jiskaske nenpòt lòt kliyan devan li yo te sèvi. Yon ka itilize komen pou apwòch sa a se fè echanj demann sèl ak repons ant yon kliyan ak yon sèvè.

Sèvè paralèl yo apwopriye nan ka kote chak demann pran yon kantite tan enpòtan nan pwosesis, oswa kliyan an ak sèvè gen yon echanj long nan mesaj. Nan chapit sa a, nou pral sitou konsantre sou fason tradisyonèl (ak pi fasil) pou konsepsyon sèvè paralèl, ki se kreye yon pwosesis pitit separe pou chak nouvo kliyan. Yon pwosesis konsa fè tout travay pou sèvi kliyan an, apre sa li fini. Piske chak nan pwosesis sa yo opere poukont li, li posib pou sèvi plizyè kliyan an menm tan. Travay prensipal la nan pwosesis sèvè prensipal la (paran) se kreye yon timoun separe pou chak nouvo kliyan (altènativman, olye pou yo pwosesis, ou ka kreye fil nan ekzekisyon).

Nan seksyon sa yo, nou pral gade egzanp sèvè iteratif ak paralèl ki baze sou priz domèn entènèt. De serveurs sa yo aplike yon vèsyon senplifye nan sèvis la eko (RFC 862) ki retounen yon kopi nenpòt mesaj kliyan an voye ba li.

eko iterasyon udp sèvè

Nan seksyon sa a ak pwochen an, nou pral prezante serveurs pou sèvis eko a. Li disponib sou pò nimewo 7 epi li travay tou de sou UDP ak TCP (pò sa a rezève, e kidonk sèvè eko a dwe kouri ak privilèj administratè).

Echo UDP sèvè a toujou ap li datagram epi retounen yon kopi yo bay moun k la. Depi sèvè a sèlman bezwen trete yon mesaj nan yon moman, yon achitekti iteratif ap sifi isit la. Fichye header pou sèvè yo montre nan Lis 56.1-XNUMX.

Lis 56.1. Dosye header pou pwogram id_echo_sv.c ak id_echo_cl.c

#include "inet_sockets.h" /* Deklare fonksyon socket nou yo */
#include "tlpi_hdr.h"

#defini SERVICE "eko" /* Non sèvis UDP */

#define BUF_SIZE 500 /* Gwosè maksimòm datagram ki kapab
ka li pa kliyan ak sèvè */
________________________________________________________________________ sockets/id_echo.h

Lis 56.2-XNUMX montre aplikasyon sèvè a. Li se vo sonje pwen sa yo:

  • pou mete sèvè a nan mòd daemon, nou itilize fonksyon becomeDaemon() ki soti nan Seksyon 37.2;

  • pou rann pwogram nan plis kontra, nou itilize bibliyotèk priz domèn entènèt ki devlope nan seksyon 55.12;

  • si sèvè a pa ka retounen yon repons bay kliyan an, li ekri yon mesaj nan boutèy la lè l sèvi avèk apèl syslog().

Nan yon aplikasyon reyèl, nou ta gen plis chans enpoze yon sèten limit sou frekans nan antre mesaj lè l sèvi avèk syslog (). Sa a ta elimine posiblite pou yon atakè debòde boutèy demi lit sistèm lan. Epitou, kenbe nan tèt ou ke chak apèl syslog () se byen chè, paske li itilize fsync () pa default.

Lis 56.2. Yon sèvè iterasyon ki aplike sèvis eko UDP la

_________________________________________________________________sockets/id_echo_sv.c
#enkli
#include "id_echo.h"
#include "become_daemon.h"

int
prensipal (int argc, char *argv [])
{
int sfd;
size_t numRead;
socklen_tlen;
struct sockaddr_storage claddr;
charbuf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

si (vin Demon(0) == -1)
errExit ("vin Daemon");

sfd = inetBind (SÈVIS, SOCK_DGRAM, NULL);
si (sfd == -1) {
syslog(LOG_ERR, "Pa t 'kapab kreye priz sèvè (%s)",
strerror(errno));
sòti (EXIT_FAILURE);

/* Resevwa datagram epi retounen kopi bay moun k ap voye yo */
}
pou(;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom (sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

si (numRead == -1)
errExit ("rekv soti nan");
if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numLi)
syslog(LOG_WARNING, "Erè nan repons pou %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c

Nou itilize pwogram nan nan lis 56.3 pou teste sèvè a. Li itilize tou bibliyotèk priz domèn Entènèt ki devlope nan Seksyon 55.12. Pwogram kliyan an pran non lame rezo a kote sèvè a sitiye kòm premye agiman sou liy lòd la. Kliyan an antre nan yon bouk kote li voye chak nan agiman ki rete yo nan sèvè a kòm datagram separe, ak Lè sa a, li ak pwodiksyon datagram yo resevwa nan men sèvè a an repons.

Lis 56.3. Kliyan pou sèvis eko UDP

#include "id_echo.h"

int
prensipal (int argc, char *argv [])
{
int sfd,j;
size_tlen;
size_t numRead;
charbuf[BUF_SIZE];

si (argc < 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s msj lame...n", argv[0]);

/* Fòme adrès sèvè a ki baze sou premye agiman liy kòmand */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
si (sfd == -1)
fatal ("Pa t 'kapab konekte ak priz sèvè");

/* Voye rès agiman yo bay sèvè a kòm datagram separe */
pou (j = 2; j < argc; j++) {
len = strlen(argv[j]);
si (ekri (sfd, argv[j], len) != len)
fatal("ekri pasyèl/echwe");

numRead = li (sfd, buf, BUF_SIZE);
si (numRead == -1)
errExit ("li");
printf("[%ld bytes] %.*sn", (long) numRead, (int) numRead, buf);
}
sòti (EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

Sa ki anba la a se yon egzanp sa nou pral wè lè nou kòmanse sèvè a ak de egzanp kliyan:

$ su // Egzije privilèj yo mare nan yon pò rezève
Modpas:
# ./id_echo_sv // Sèvè a ale nan background nan
# sòti // abandone dwa admin
$ ./id_echo_cl localhost hello world // Kliyan sa a voye de datagram
[5 bytes] alo // Kliyan an bay repons yo resevwa nan men sèvè a
[5 bytes] mond
$ ./id_echo_cl localhost orevwa // Kliyan sa a voye yon sèl datagram
[7 bytes] orevwa

Mwen swete w yon lekti bèl)

Sous: linux.org.ru