Libro nga "Linux API. Komprehensibo nga Giya"


Libro nga "Linux API. Komprehensibo nga Giya"

Maayong hapon Gipresentar ko sa imong pagtagad ang libro nga "Linux API. Usa ka komprehensibo nga giya" (paghubad sa libro Ang Linux Programming Interface). Mahimo kini ma-order sa website sa magmamantala, ug kung imong i-apply ang code nga pang-promosyon LinuxAPI , makadawat ka ug 30% nga diskwento.

Kinutlo gikan sa libro alang sa pakisayran:

Mga Socket: Arkitektura sa Server

Niini nga kapitulo, atong hisgutan ang mga sukaranan sa pagdesinyo sa iterative ug parallel servers, ug tan-awon usab ang usa ka espesyal nga daemon nga gitawag ug inetd, nga nagpasayon ​​sa paghimo sa mga aplikasyon sa Internet server.

Iterative ug parallel servers

Adunay duha ka sagad nga socket-based network server architectures:

  • iterative: ang server nag-alagad sa mga kliyente sa usa ka higayon, una sa pagproseso sa usa ka hangyo (o sa pipila ka mga hangyo) gikan sa usa ka kliyente ug dayon mobalhin ngadto sa sunod;

  • parallel: ang server gidisenyo aron mag-alagad sa daghang mga kliyente nga dungan.

Usa ka pananglitan sa usa ka iterative server base sa FIFO queues gipresentar na sa Seksyon 44.8.

Ang mga iterative server kasagarang angayan lamang sa mga sitwasyon diin ang mga hangyo sa kliyente maproseso sa patas nga paagi, tungod kay ang matag kliyente mapugos sa paghulat hangtud nga ang uban nga mga kliyente sa atubangan niini maserbisyuhan. Usa ka komon nga kaso sa paggamit niini nga pamaagi mao ang pagbayloay sa usa ka hangyo ug tubag tali sa usa ka kliyente ug server.

Ang mga parallel server angayan sa mga kaso diin ang matag hangyo nagkinahanglan og daghang panahon sa pagproseso, o diin ang kliyente ug server nakigbahin sa taas nga pagbayloay sa mensahe. Niini nga kapitulo, mag-una kita sa pag-focus sa tradisyonal (ug pinakayano) nga paagi sa pagdesinyo sa parallel servers, nga mao ang paghimo og bulag nga proseso sa bata alang sa matag bag-ong kliyente. Kini nga proseso naghimo sa tanan nga trabaho aron sa pag-alagad sa kliyente ug dayon matapos. Tungod kay ang matag usa niini nga mga proseso naglihok nga independente, posible nga mag-alagad sa daghang mga kliyente nga dungan. Ang nag-unang tahas sa nag-unang proseso sa server (ginikanan) mao ang paghimo og usa ka bulag nga bata alang sa matag bag-ong kliyente (sa laing paagi, ang mga hilo sa pagpatay mahimong mabuhat imbes sa mga proseso).

Sa mosunod nga mga seksyon, atong tan-awon ang mga pananglitan sa iterative ug parallel nga internet domain socket servers. Kining duha ka mga server nagpatuman sa usa ka gipasimple nga bersyon sa serbisyo sa echo (RFC 862), nga nagbalik sa usa ka kopya sa bisan unsang mensahe nga gipadala niini sa usa ka kliyente.

Nagbalikbalik nga UDP server echo

Niini ug sa sunod nga seksyon atong ipaila ang mga server alang sa serbisyo sa echo. Anaa kini sa port number 7 ug magamit sa UDP ug TCP (kini nga pantalan gireserba, ug busa ang echo server kinahanglan nga ipadagan nga adunay mga pribilehiyo sa tagdumala).

Ang echo UDP server padayon nga nagbasa sa mga datagrams ug nagbalik sa mga kopya niini ngadto sa nagpadala. Tungod kay ang server kinahanglan ra nga magproseso sa usa ka mensahe sa usa ka higayon, ang usa ka iterative nga arkitektura igo na. Ang header file alang sa mga server gipakita sa Listing 56.1.

Paglista 56.1. Header file para sa mga programa nga id_echo_sv.c ug id_echo_cl.c

#include "inet_sockets.h" /* Gipahayag ang mga gimbuhaton sa among socket */
#ilakip ang "tlpi_hdr.h"

#define SERBISYO "echo" /* UDP service name */

#define BUF_SIZE 500 /* Pinakataas nga gidak-on sa mga datagrams nga
mabasa sa kliyente ug server */
_____________________________________________________________________sockets/id_echo.h

Ang lista sa 56.2 nagpakita sa pagpatuman sa server. Ang mosunod nga mga punto angay nga matikdan:

  • aron ibutang ang server sa daemon mode, atong gamiton ang nahimongDaemon() function gikan sa seksyon 37.2;

  • aron mahimo ang programa nga mas compact, among gigamit ang librarya alang sa pagtrabaho sa mga socket sa domain sa Internet, nga gihimo sa seksyon 55.12;

  • kung ang server dili makabalik sa tubag sa kliyente, nagsulat kini og mensahe sa log gamit ang syslog() nga tawag.

Sa usa ka tinuod nga aplikasyon, lagmit atong ipahamtang ang pipila ka limitasyon sa frequency sa pag-log sa mga mensahe gamit ang syslog(). Kini magwagtang sa posibilidad sa usa ka tig-atake nga moawas sa log sa sistema. Dugang pa, ayaw kalimti nga ang matag tawag sa syslog() mahal kaayo, tungod kay kini naggamit sa fsync() nga default.

Paglista 56.2. Ang iteration server nga nagpatuman sa UDP echo service

_________________________________________________________________socket/id_echo_sv.c
#apil
#ilakip ang "id_echo.h"
#include "mahimong_daemon.h"

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

kung (mahimongDaemon(0) == -1)
errExit("mahimongDaemon");

sfd = inetBind(SERBISYO, SOCK_DGRAM, NULL);
kon (sfd == -1) {
syslog(LOG_ERR, "Dili makahimo sa server socket (%s)",
strerror(errno));
exit(EXIT_FAILURE);

/* Dawata ang mga datagrams ug ibalik ang mga kopya niini ngadto sa mga nagpadala */
}
kay (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

kung (numRead == -1)
errExit("recvfrom");
if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "Error sa pagpalanog sa tubag sa %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________socket/id_echo_sv.c

Aron masulayan ang operasyon sa server, among gigamit ang programa gikan sa Listing 56.3. Gigamit usab niini ang librarya alang sa pagtrabaho sa mga socket sa domain sa Internet, nga gihimo sa seksyon 55.12. Isip unang argumento sa command line, ang programa sa kliyente nagkuha sa ngalan sa network node diin nahimutang ang server. Ang kliyente mosulod sa usa ka loop diin ipadala niini ang matag usa sa nahabilin nga mga argumento ngadto sa server isip bulag nga mga datagram, ug dayon basahon ug i-print ang mga datagram nga nadawat niini gikan sa server isip tubag.

Paglista 56.3. Kliyente alang sa serbisyo sa echo sa UDP

#ilakip ang "id_echo.h"

int
main(int argc, char *argv[])
{
int sfd, j;
gidak-on_t len;
ssize_t numRead;
char buf[BUF_SIZE];

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

/* Porma ang adres sa server base sa unang argumento sa command line */
sfd = inetConnect(argv[1], SERBISYO, SOCK_DGRAM);
kung (sfd == -1)
fatal("Dili makakonekta sa socket sa server");

/* Ipadala ang nahabilin nga mga argumento sa server sa porma sa bulag nga datagrams */
kay (j = 2; j < argc; j++) {
len = strlen(argv[j]);
kon (isulat(sfd, argv[j], len) != len)
fatal("partial/pakyas pagsulat");

numRead = basaha(sfd, buf, BUF_SIZE);
kung (numRead == -1)
errExit("basaha");
printf("[%ld bytes] %.*sn", (taas) numRead, (int) numRead, buf);
}
exit(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

Sa ubos usa ka pananglitan kung unsa ang atong makita kung nagdagan ang server ug duha nga mga higayon sa kliyente:

$su // Ang mga pribilihiyo gikinahanglan aron mabugkos sa usa ka gireserba nga pantalan
password:
# ./id_echo_sv // Ang server moadto sa background mode
# exit // Isalikway ang mga katungod sa tagdumala
$ ./id_echo_cl localhost hello world // Kini nga kliyente nagpadala ug duha ka datagrams
[5 bytes] hello // Gipakita sa kliyente ang tubag nga nadawat gikan sa server
[5 bytes] kalibutan
$ ./id_echo_cl localhost goodbye // Kini nga kliyente nagpadala ug usa ka datagram
[7 bytes] paalam

Nanghinaut ko nga usa ka nindot nga pagbasa)

Source: linux.org.ru