Buku "Linux API. Pituduh Komprehensif"


Buku "Linux API. Pituduh Komprehensif"

Wilujeng sonten Kuring nampilkeun ka perhatian anjeun buku "Linux API. Pitunjuk komprehensif" (tarjamahan buku Antarmuka Pemrograman Linux). Ieu bisa maréntahkeun dina ramatloka penerbit, sarta lamun nerapkeun kode promosi LinuxAPI , anjeun bakal nampa diskon 30%.

Kutipan tina buku pikeun rujukan:

Sockets: Arsitéktur Server

Dina bab ieu, urang bakal ngabahas dasar ngarancang server iterative sarta paralel, sarta ogé kasampak dina daemon husus disebut inetd, nu matak ngamudahkeun pikeun nyieun aplikasi server Internet.

Server iterative sareng paralel

Aya dua arsitéktur pangladén jaringan basis stop kontak umum:

  • iteratif: server ngalayanan klien hiji-hiji, mimiti ngolah hiji pamundut (atawa sababaraha requests) ti hiji klien lajeng ngaléngkah ka hareup;

  • paralel: server dirancang pikeun ngalayanan sababaraha klien sakaligus.

Conto server iteratif dumasar kana antrian FIFO parantos dibere dina Bagéan 44.8.

Server iterative biasana ngan cocog dina situasi dimana requests klien bisa diolah cukup gancang, saprak unggal klien kapaksa antosan dugi sagala klien sejenna di hareup eta geus dilayanan. Kasus pamakéan umum pikeun pendekatan ieu bursa tina requests tunggal jeung réspon antara hiji klien tur server.

Server paralel anu cocog dina kasus dimana unggal pamundut butuh jumlah signifikan waktu pikeun ngolah, atawa dimana klien tur server kalibet dina séntral pesen panjang. Dina bab ieu, urang utamana bakal difokuskeun cara tradisional (jeung pangbasajanna) ngarancang server paralel, nu nyieun prosés anak misah pikeun tiap klien anyar. Proses ieu ngalaksanakeun sadaya padamelan pikeun ngalayanan klien teras ditungtungan. Kusabab unggal prosés ieu beroperasi sacara mandiri, tiasa ngalayanan sababaraha klien sakaligus. Tugas utama prosés server utama (indungna) nya éta nyieun anak misah pikeun tiap klien anyar (Alternatipna, threads palaksanaan bisa dijieun gaganti prosés).

Dina bagian di handap ieu, urang bakal ningali conto server stop kontak domain internét iterative sareng paralel. Dua server ieu nerapkeun versi saderhana tina layanan gema (RFC 862), anu ngabalikeun salinan pesen anu dikirimkeun ku klien.

Iterative UDP server gema

Dina ieu sareng bagian salajengna urang bakal ngenalkeun server pikeun layanan gema. Éta sayogi dina nomer port 7 sareng dianggo dina UDP sareng TCP (port ieu ditangtayungan, sareng ku kituna server écho kedah dijalankeun kalayan hak istimewa administrator).

Server UDP gema terus-terusan maca datagram sareng malikkeun salinanana ka pangirim. Kusabab server ngan perlu ngolah hiji pesen dina hiji waktu, hiji arsitektur iterative bakal cukup. File lulugu pikeun server dipidangkeun dina Listing 56.1.

Daptar 56.1. File lulugu pikeun program id_echo_sv.c jeung id_echo_cl.c

#include "inet_sockets.h" /* Nyatakeun fungsi stop kontak kami */
#include "tlpi_hdr.h"

#define SERVICE "gema" /* Ngaran layanan UDP */

#define BUF_SIZE 500 /* Ukuran maksimum datagrams yén
tiasa dibaca ku klien sareng server */
_____________________________________________________________________sockets/id_echo.h

Listing 56.2 nembongkeun palaksanaan server. Poin di handap ieu patut diperhatikeun:

  • pikeun nempatkeun server kana modeu daemon, kami nganggo fungsi becomeDaemon () tina bagian 37.2;

  • sangkan program leuwih kompak, kami nganggo perpustakaan pikeun gawé bareng sockets domain Internet, dimekarkeun dina bagian 55.12;

  • lamun server teu bisa balik respon kana klien nu, nyerat pesen ka log ngagunakeun syslog () nelepon.

Dina aplikasi nyata, urang dipikaresep bakal maksakeun sababaraha wates dina frékuénsi logging pesen maké syslog (). Ieu bakal ngaleungitkeun kamungkinan panyerang ngalangkungan log sistem. Sajaba ti éta, ulah poho yén unggal panggero pikeun syslog () rada mahal, saprak éta ngagunakeun fsync () sacara standar.

Daptar 56.2. Server Iteration anu ngalaksanakeun layanan gema UDP

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

lamun (jadiDaemon(0) == -1)
errExit("jantenDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
lamun (sfd == -1) {
syslog(LOG_ERR, "Teu bisa nyieun stop kontak server (%s)",
strerror(errno));
kaluar (EXIT_FAILURE);

/* Nampi datagrams sareng mulangkeun salinanana ka pangirim */
}
keur (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom (sfd, buf, BUF_SIZE, 0, (struct sockaddr *) & claddr, & len);

lamun (numRead == -1)
errExit("recvfrom");
lamun (sendto(sfd, buf, numRead, 0, (struct sockaddr *) & claddr, len)
!= numBaca)
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

Pikeun nguji operasi pangladén, kami nganggo program tina Listing 56.3. Ogé ngagunakeun perpustakaan pikeun gawé bareng sockets domain Internet, dimekarkeun dina bagian 55.12. Salaku argumen baris paréntah kahiji, program klien nyokot ngaran titik jaringan dimana server lokasina. Klien asup ka loop dimana eta ngirimkeun unggal argumen sésana ka server salaku datagrams misah, lajeng maca jeung prints datagrams eta narima ti server dina respon.

Daptar 56.3. Klién pikeun layanan gema UDP

#include "id_echo.h"

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

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

/* Bentuk alamat server dumasar kana argumen baris paréntah kahiji */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
lamun (sfd == -1)
fatal("Teu bisa nyambung ka stop kontak server");

/* Kirim sésana argumen ka server dina bentuk datagrams misah */
pikeun (j = 2; j <argc; j++) {
len = strlen(argv[j]);
lamun (tulis(sfd, argv[j], len)!= len)
fatal("sawaréh/gagal nulis");

numRead = dibaca (sfd, buf, BUF_SIZE);
lamun (numRead == -1)
errExit("baca");
printf("[%ld bytes] %.*sn", (panjang) numRead, (int) numRead, buf);
}
kaluar (EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c

Di handap ieu conto naon anu bakal urang tingali nalika ngajalankeun server sareng dua instansi klien:

$su // Hak husus diperlukeun pikeun ngabeungkeut port ditangtayungan
password:
# ./id_echo_sv // Server asup kana modeu latar
# kaluar // Nyerah hak administrator
$ ./id_echo_cl localhost hello world // klien ieu ngirimkeun dua datagrams
[5 bait] halo // Klien nampilkeun réspon anu ditampi ti server
[5 bait] dunya
$ ./id_echo_cl localhost wilujeung // klien ieu ngirim hiji datagram
[7 bait] wilujeung

Abdi ngarepkeun anjeun bacaan anu saé)

sumber: linux.org.ru