Boky "Linux API. Torolàlana feno"


Boky "Linux API. Torolàlana feno"

Salama Atolotro ho anareo ny boky “Linux API. Torolalana feno" (fandikana ny boky Ny Linux Programming Interface). Azo alaina ao amin'ny tranokalan'ny mpamoaka izany, ary raha mampihatra ny code promotion ianao LinuxAPI , hahazo fihenam-bidy 30% ianao.

Soso-kevitra avy amin'ny boky ho reference:

Sockets: Architecture Server

Ato amin'ity toko ity dia hiresaka momba ny fototry ny fandrafetana mpizara iterative sy parallèle isika, ary hijery ihany koa ny daemon manokana antsoina hoe inetd, izay manamora ny famoronana rindranasa mpizara Internet.

Servers iterative sy parallèle

Misy rafitra mpizara tambajotra mifototra amin'ny socket roa mahazatra:

  • iterative: ny mpizara dia manompo mpanjifa iray isaky ny mandeha, manodina fangatahana iray (na fangatahana maromaro) avy amin'ny mpanjifa iray ary avy eo dia mandroso mankany amin'ny manaraka;

  • parallèle: natao hanompo mpanjifa maro miaraka ny mpizara.

Ohatra iray amin'ny mpizara miverimberina mifototra amin'ny filaharana FIFO dia efa naseho tao amin'ny fizarana 44.8.

Matetika ny mpizara iterative dia mety amin'ny toe-javatra izay ahafahan'ny mpanjifa karakaraina haingana, satria ny mpanjifa tsirairay dia voatery miandry mandra-pahatongan'ny mpanjifa hafa eo anoloany. Ny tranga fampiasa mahazatra amin'ity fomba ity dia ny fifanakalozana fangatahana sy valiny tokana eo amin'ny mpanjifa sy ny mpizara.

Ny mpizara parallèle dia mety amin'ny tranga izay mitaky fotoana be ny fangatahana tsirairay, na izay misy ny mpanjifa sy ny mpizara amin'ny fifanakalozana hafatra lava. Amin'ity toko ity dia hifantoka indrindra amin'ny fomba nentim-paharazana (sy tsotra indrindra) amin'ny fandrafetana lohamilina mifanitsy isika, dia ny famoronana dingana mitokana ho an'ny mpanjifa vaovao tsirairay. Ity dingana ity dia manatanteraka ny asa rehetra hanompoana ny mpanjifa ary mifarana avy eo. Satria ny tsirairay amin'ireo dingana ireo dia miasa tsy miankina, azo atao ny manompo mpanjifa marobe miaraka. Ny asa lehibe indrindra amin'ny fizotran'ny mpizara (ray aman-dreny) dia ny mamorona zaza misaraka ho an'ny mpanjifa vaovao tsirairay (raha tsy izany, ny kofehy famonoana dia azo noforonina fa tsy dingana).

Ao amin'ireto fizarana manaraka ireto dia hijery ohatra momba ny mpizara socket amin'ny Internet miverimberina sy mifanitsy. Ireo lohamilina roa ireo dia manatanteraka dikan-teny tsotsotra amin'ny serivisy echo (RFC 862), izay mamerina ny dika mitovy amin'izay hafatra nalefan'ny mpanjifa azy.

Akon'ny mpizara UDP miverimberina

Amin'ity sy ny fizarana manaraka dia hampiditra ireo mpizara ho an'ny serivisy echo. Misy amin'ny seranan-tsambo laharana 7 izy io ary miasa amin'ny UDP sy TCP (voatokana io seranana io, ary noho izany dia tsy maintsy mandeha miaraka amin'ny tombontsoan'ny mpitantana ny server echo).

Ny mpizara echo UDP dia mamaky tsy an-kijanona ny datagrams ary mamerina ny dika mitovy amin'izany amin'ny mpandefa. Koa satria ny mpizara dia mila manodina hafatra iray isaky ny mandeha, dia ampy ny maritrano iterative. Ny rakitra lohatenin'ny lohamilina dia aseho ao amin'ny Listing 56.1.

Lisitra 56.1. Lohateny rakitra ho an'ny programa id_echo_sv.c sy id_echo_cl.c

#include "inet_sockets.h" /* Manambara ny fiasan'ny socket */
#include "tlpi_hdr.h"

#define SERVICE "echo" /* anaran'ny serivisy UDP */

#define BUF_SIZE 500 /* Habe ambony indrindra amin'ny datagrams izay
azo vakian'ny mpanjifa sy mpizara */
_____________________________________________________________________sockets/id_echo.h

Ny lisitra 56.2 dia mampiseho ny fampiharana ny mpizara. Tsara homarihina ireto teboka manaraka ireto:

  • mba hametrahana ny mpizara amin'ny fomba daemon, dia mampiasa ny lasaDaemon() asa avy amin'ny fizarana 37.2;

  • mba hahatonga ny programa ho mora kokoa, mampiasa ny tranomboky izahay mba hiasa amin'ny sockets amin'ny Internet, novolavolaina tao amin'ny fizarana 55.12;

  • raha tsy afaka mamerina valiny amin'ny mpanjifa ny mpizara, dia manoratra hafatra amin'ny log mampiasa ny antso syslog().

Amin'ny fampiharana tena izy dia azo inoana fa hametraka fetra vitsivitsy amin'ny fatran'ny hafatra fanoratana mampiasa syslog(). Izany dia hanafoana ny mety hisian'ny mpanafika hihoatra ny log system. Ankoatra izany, aza adino fa ny antso tsirairay amin'ny syslog() dia lafo be, satria mampiasa fsync() amin'ny alàlan'ny default.

Lisitra 56.2. Mpizara iteration izay mampihatra ny serivisy echo UDP

_________________________________________________________________sockets/id_echo_sv.c
#include
#include "id_echo.h"
#ampidiro ny "become_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];

raha (lasaDaemon(0) == -1)
errExit("Tonga Daemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
raha (sfd == -1) {
syslog(LOG_ERR, "Tsy afaka namorona socket server (%s)",
strerror(errno));
fivoahana(EXIT_FAILURE);

/* Mandraisa datagrams ary avereno any amin'ny mpandefa ny dika mitovy aminy */
}
ho an'ny (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) & claddr, &len);

raha (numRead == -1)
errExit("recvfrom");
raha (sendto(sfd, buf, numRead, 0, (struct sockaddr *) & claddr, len)
!= numRead)
syslog(LOG_WARNING, "Error echoing response to %s (%s)",
inetAddressStr((struct sockaddr *) & claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c

Mba hitsapana ny fiasan'ny mpizara dia mampiasa ny programa avy amin'ny Listing 56.3 izahay. Mampiasa ny tranomboky ihany koa izy amin'ny fiasana amin'ny socket domaine Internet, novolavolaina tao amin'ny fizarana 55.12. Amin'ny maha tohan-kevitra andalana voalohany, ny programa mpanjifa dia maka ny anaran'ny node tambajotra misy ny mpizara. Ny mpanjifa dia miditra ao amin'ny loop iray izay handefasana ny hevitra sisa tavela amin'ny server ho toy ny datagrams misaraka, ary avy eo mamaky sy manonta ny datagrams azony avy amin'ny server ho setrin'izany.

Lisitra 56.3. Mpanjifa amin'ny serivisy echo UDP

#include "id_echo.h"

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

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

/* Amboary ny adiresin'ny mpizara mifototra amin'ny tohan-kevitra andalana voalohany */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
raha (sfd == -1)
fatal("Tsy afaka mifandray amin'ny socket server");

/* Alefaso any amin'ny mpizara ny hevitra sisa tavela amin'ny endrika datagrams misaraka */
ho an'ny (j = 2; j < argc; j++) {
len = strlen(argv[j]);
raha (soraty(sfd, argv[j], len) != len)
fatal("ampahany/tsy nahomby ny fanoratana");

numRead = mamaky(sfd, buf, BUF_SIZE);
raha (numRead == -1)
errExit("vakio");
printf("[%ld bytes] %.*sn", (lava) numRead, (int) numRead, buf);
}
fivoahana(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

Ity ambany ity ny ohatra iray amin'ny zavatra ho hitantsika rehefa mihazakazaka ny mpizara sy ny mpanjifa roa:

$su // Ny tombontsoa dia takiana mba hamatotra amin'ny seranana voatokana
Password:
# ./id_echo_sv // Ny mpizara dia miditra amin'ny fomba fiaviana
# fivoahana // Afoy ny zon'ny mpitantana
$ ./id_echo_cl localhost hello world // Ity mpanjifa ity dia mandefa datagrama roa
[5 bytes] salama // Ny mpanjifa dia mampiseho ny valiny azo avy amin'ny mpizara
[5 bytes] izao tontolo izao
$ ./id_echo_cl localhost veloma // Ity mpanjifa ity dia mandefa datagrama iray
[7 bytes] veloma

Mirary famakiana mahafinaritra ho anao aho)

Source: linux.org.ru