Bhuku "Linux API. Comprehensive Guide"


Bhuku "Linux API. Comprehensive Guide"

Masikati akanaka Ini ndinopa kwauri bhuku "Linux API. Gwaro rakazara" (shanduro yebhuku Iyo Linux Programming Interface) Inogona kuodha pawebhusaiti yemuparidzi, uye kana ukashandisa kodhi yekushambadzira LinuxAPI , iwe uchagamuchira 30% discount.

Chidimbu kubva mubhuku rekutarisa:

Zvigadziko: Server Architecture

Muchitsauko chino, tichakurukura zvekutanga zvekugadzira iterative uye parallel maseva, uye zvakare kutarisa yakakosha daemon inonzi inetd, iyo inoita kuti zvive nyore kugadzira Internet server application.

Iterative uye parallel maseva

Kune maviri akajairwa socket-based network server architectures:

  • iterative: sevha inoshandira vatengi imwe panguva, kutanga kugadzirisa chikumbiro (kana zvikumbiro zvakati wandei) kubva kune mumwe mutengi uye yozoenda kune inotevera;

  • parallel: sevha yakagadzirirwa kushandira vatengi vakawanda panguva imwe chete.

Muenzaniso weiyo iterative server yakavakirwa paFIFO mitsetse yakanga yatounzwa muChikamu 44.8.

Iterative maseva anowanzo akakodzera chete mumamiriro ezvinhu apo zvikumbiro zvevatengi zvinogona kugadziriswa nekukurumidza, sezvo mutengi wega wega anomanikidzwa kumirira kusvika chero vatengi vari pamberi payo vapihwa. Chinhu chakajairika chekushandisa kune iyi nzira ndeyekuchinjana kwechikumbiro chimwe chete uye mhinduro pakati pemutengi neserver.

Masevha akafanana akakodzera mumamiriro ezvinhu apo chikumbiro chega chega chinotora nguva yakawanda yekugadzirisa, kana apo mutengi neseva vanobatana mukutsinhana kwemashoko marefu. Muchitsauko chino, isu tichanyanya kutarisa kune yechinyakare (uye yakapusa) nzira yekugadzira akafanana maseva, iri kugadzira yakaparadzana yemwana maitiro kune yega yega mutengi mutsva. Iyi nzira inoita basa rose rekushandira mutengi uye inopera. Nekuti imwe neimwe yemaitiro aya inoshanda yakazvimirira, zvinokwanisika kushandira vatengi vakawanda panguva imwe chete. Basa guru reiyo main server process (mubereki) kugadzira mwana akaparadzana kune wega wega mutengi mutsva (nemwewo, tambo dzekuuraya dzinogona kugadzirwa pachinzvimbo chemaitiro).

Muzvikamu zvinotevera, isu tichatarisa mienzaniso ye iterative uye yakafanana internet domain socket servers. Aya maseva maviri anoisa vhezheni yakareruka yeiyo echo sevhisi (RFC 862), iyo inodzosera kopi yechero meseji inotumirwa kwairi nemutengi.

Iterative UDP server echo

Muchikamu chino uye chinotevera tichasuma maseva ebasa re echo. Inowanikwa pachiteshi nhamba 7 uye inoshanda pamusoro peese UDP neTCP (chiteshi ichi chakachengetwa, uye saka sevha echo inofanirwa kumhanyirwa neropafadzo dzemaneja).

Iyo echo UDP server inoramba ichiverenga datagraphs uye inodzosera makopi ayo kune anotumira. Sezvo sevha ichingoda kugadzirisa meseji imwe panguva, dhizaini yekuvaka inokwana. Iyo yemusoro faira yemaseva inoratidzwa muChinyorwa 56.1.

Listing 56.1. Musoro faira rezvirongwa id_echo_sv.c uye id_echo_cl.c

#include "inet_sockets.h" /* Inozivisa mabasa esoketi yedu */
#inosanganisira "tlpi_hdr.h"

#define SERVICE "echo" /* UDP zita rebasa */

#define BUF_SIZE 500 /* Yakanyanya saizi yemadatagrams ayo
inogona kuverengwa nemutengi uye sevha */
_____________________________________________________________________Masoketi/id_echo.h

Rondedzero 56.2 inoratidza kushandiswa kweseva. Aya mapoinzi anotevera akakodzera kucherechedzwa:

  • kuisa sevha mu daemon mode, tinoshandisa iyo becomeDaemon () basa kubva muchikamu 37.2;

  • kuita kuti chirongwa chiwedzere kuwirirana, tinoshandisa raibhurari yekushanda neInternet domain sockets, yakagadzirwa muchikamu 55.12;

  • kana sevha isingakwanise kudzosera mhinduro kumutengi, inonyora meseji kulogi uchishandisa iyo syslog () kufona.

Mukushandisa chaiko, isu tingangoisa imwe muganho pane kuwanda kwekutema mameseji uchishandisa syslog (). Izvi zvaizobvisa mukana weanorwisa achifashukira system log. Pamusoro pezvo, usakanganwa kuti kufona kwega kwega ku syslog () kunodhura zvakanyanya, nekuti inoshandisa fsync () nekukasira.

Listing 56.2. Iteration server inoshandisa iyo UDP echo sevhisi

_______________________________________________________________masoketi/id_echo_sv.c
#include
#inosanganisira "id_echo.h"
#include "become_daemon.h"

Int
chikuru (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];

kana (kuvaDaemon(0) == -1)
errExit("kuvaDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
kana (sfd == -1) {
syslog(LOG_ERR, "Haina kukwanisa kugadzira server socket (%s)",
strerror (errno));
kubuda(EXIT_FAILURE);

/* Gamuchira datagrams uye udzorere makopi avo kune vanotumira */
}
zve (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

kana (numRead == -1)
errExit("recvfrom");
kana (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "Chikanganiso pakuita maungira ku%s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror (errno));
}
}
_______________________________________________________________masoketi/id_echo_sv.c

Kuti uedze kushanda kwesevha, isu tinoshandisa chirongwa kubva Kunyorwa 56.3. Inoshandisawo raibhurari yekushanda neInternet domain sockets, yakagadzirwa muchikamu 55.12. Seyekutanga yekuraira mutsara nharo, iyo mutengi chirongwa inotora zita retiweki node pane iyo server iripo. Mutengi anopinda muchiuno kwaanotumira imwe neimwe yenharo dzasara kune sevha seyakasiyana datagrams, uye ipapo anoverenga uye anodhinda datagrams yaanogamuchira kubva kuseva mukupindura.

Listing 56.3. Mutengi weUDP echo sevhisi

#inosanganisira "id_echo.h"

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

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

/* Gadzira sevha kero zvichibva pane yekutanga yekuraira mutsara nharo */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
kana (sfd == -1)
inouraya ("Haikwanise kubatana kune server socket");

/* Tumira nharo dzasara kune sevha nenzira yedatagraphs yakaparadzana */
ye(j = 2; j <argc; j++) {
len = strlen(argv[j]);
kana (nyora(sfd, argv[j], len) != len)
zvinouraya ("chikamu / chakakundikana kunyora");

numRead = verenga(sfd, buf, BUF_SIZE);
kana (numRead == -1)
errExit("verenga");
printf("[%ld bytes] %.*sn", (refu) numRead, (int) numRead, buf);
}
kubuda(EXIT_SUCCESS);
}
_______________________________________________________________masoketi/id_echo_cl.c

Pazasi pane muenzaniso wezvatichaona kana uchimhanyisa sevha uye maviri evatengi zviitiko:

$su // Ropafadzo dzinodikanwa kusunga kune yakachengetwa chiteshi
Pasiwedhi:
# ./id_echo_sv // Server inopinda mumashure modhi
# buda // Rega kodzero dzemaneja
$ ./id_echo_cl localhost mhoro nyika // Mutengi uyu anotumira dhatagiramu mbiri
[5 bytes] mhoro // Mutengi anoratidza mhinduro yakagamuchirwa kubva kuseva
[5 bytes] nyika
$ ./id_echo_cl localhost goodbye // Mutengi uyu anotumira imwe datagram
[7 bytes] mosara zvakanaka

Ndinokushuvirai kuverenga kwakanaka)

Source: linux.org.ru