Buku "Linux API. Panduan Lengkap"


Buku "Linux API. Panduan Lengkap"

sugeng sonten Aku menehi perhatian marang buku "Linux API. Panuntun lengkap" (terjemahan buku Antarmuka Pemrograman Linux). Bisa dipesen ing situs web penerbit, lan yen sampeyan nggunakake kode promosi LinuxAPI , sampeyan bakal nampa diskon 30%.

Kutipan saka buku kanggo referensi:

Soket: Arsitektur Server

Ing bab iki, kita bakal ngrembug dhasar ngrancang server iteratif lan podo, lan uga katon ing daemon khusus disebut inetd, kang nggampangake kanggo nggawe aplikasi server Internet.

Server iteratif lan paralel

Ana rong arsitektur server jaringan basis soket umum:

  • iteratif: server nglayani klien siji-sijine, ngolah panjaluk (utawa sawetara panjaluk) saka siji klien banjur pindhah menyang sabanjure;

  • podo karo: server dirancang kanggo ngawula sawetara klien bebarengan.

Conto server iteratif adhedhasar antrian FIFO wis ditampilake ing Bagean 44.8.

Server iteratif biasane mung cocok ing kahanan sing panjaluk klien bisa diproses kanthi cepet, amarga saben klien dipeksa ngenteni nganti klien liyane sing ana ing ngarepe wis dilayani. Kasus panggunaan umum kanggo pendekatan iki yaiku ijol-ijolan panjalukan lan tanggapan siji ing antarane klien lan server.

Server paralel cocok ing kasus nalika saben panyuwunan mbutuhake wektu sing akeh kanggo diproses, utawa ing ngendi klien lan server melu ijol-ijolan pesen sing dawa. Ing bab iki, kita bakal utamané fokus ing cara tradisional (lan paling gampang) ngrancang server podo, kang kanggo nggawe proses anak kapisah kanggo saben klien anyar. Proses iki nindakake kabeh karya kanggo ngawula klien lan banjur ends. Amarga saben pangolahan iki makaryakke independen, iku bisa kanggo ngawula sawetara klien bebarengan. Tugas utama proses server utama (wong tuwa) yaiku nggawe anak sing kapisah kanggo saben klien anyar (utawa, benang eksekusi bisa digawe tinimbang proses).

Ing bagean ing ngisor iki, kita bakal ndeleng conto server soket domain internet iteratif lan paralel. Server loro iki ngetrapake versi layanan gema sing disederhanakake (RFC 862), sing ngasilake salinan pesen sing dikirim menyang klien.

Echo server UDP iteratif

Ing bagean iki lan sabanjure kita bakal ngenalake server kanggo layanan gema. Kasedhiya ing port nomer 7 lan bisa digunakake liwat UDP lan TCP (port iki dilindhungi undhang-undhang, lan mulane server gema kudu mbukak kanthi hak istimewa administrator).

Server UDP echo terus-terusan maca datagram lan ngasilake salinan kasebut menyang pangirim. Amarga server mung perlu ngolah pesen siji-sijine, arsitektur iteratif bakal cukup. File header kanggo server ditampilake ing Listing 56.1.

Daftar 56.1. File header kanggo program id_echo_sv.c lan id_echo_cl.c

#include "inet_sockets.h" /* Nyatakake fungsi soket kita */
#include "tlpi_hdr.h"

#define SERVICE "echo" /* jeneng layanan UDP */

#define BUF_SIZE 500 /* Ukuran maksimum datagrams sing
bisa diwaca dening klien lan server */
_____________________________________________________________________sockets/id_echo.h

Listing 56.2 nuduhake implementasine server. Titik ing ngisor iki kudu digatekake:

  • kanggo nyelehake server menyang mode daemon, kita nggunakake fungsi becomeDaemon () saka bagean 37.2;

  • kanggo nggawe program luwih kompak, kita nggunakake perpustakaan kanggo nggarap soket domain Internet, dikembangaké ing bagean 55.12;

  • yen server ora bisa bali respon kanggo klien, nulis pesen menyang log nggunakake syslog () telpon.

Ing aplikasi nyata, kita kamungkinan bakal nemtokke sawetara watesan ing frekuensi pesen logging nggunakake syslog (). Iki bakal ngilangi kemungkinan penyerang ngluwihi log sistem. Kajaba iku, aja lali sing saben telpon kanggo syslog () cukup larang, awit iku nggunakake fsync () minangka standar.

Daftar 56.2. Server iterasi sing ngetrapake layanan gema UDP

_________________________________________________________________soket/id_echo_sv.c
#kalebu
#include "id_echo.h"
#include "dadi_daemon.h"

int
utama(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];

yen (dadiDaemon(0) == -1)
errExit("dadiDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
yen (sfd == -1) {
syslog(LOG_ERR, "Ora bisa nggawe soket server (%s)",
strerror(errno));
metu (EXIT_FAILURE);

/* Nampa datagrams lan bali salinane menyang pangirim */
}
kanggo (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) & claddr, & len);

yen (numRead == -1)
errExit("recvfrom");
if (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));
}
}
_________________________________________________________________soket/id_echo_sv.c

Kanggo nyoba operasi server, kita nggunakake program saka Listing 56.3. Uga nggunakake perpustakaan kanggo nggarap soket domain Internet, sing dikembangake ing bagean 55.12. Minangka argumen baris perintah pisanan, program klien njupuk jeneng simpul jaringan ing ngendi server dumunung. Klien ngetik daur ulang sing ngirim saben argumen sing isih ana menyang server minangka datagram sing kapisah, banjur maca lan nyithak datagram sing ditampa saka server minangka respon.

Daftar 56.3. Klien kanggo layanan gema UDP

#include "id_echo.h"

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

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

/* Mbentuk alamat server adhedhasar argumen baris perintah pisanan */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
yen (sfd == -1)
fatal("Ora bisa nyambung menyang soket server");

/* Kirimi argumen sing isih ana menyang server kanthi bentuk datagram sing kapisah */
kanggo (j = 2; j < argc; j++) {
len = strlen(argv[j]);
yen (tulis(sfd, argv[j], len) != len)
fatal("tulisan sebagian/gagal");

numRead = maca (sfd, buf, BUF_SIZE);
yen (numRead == -1)
errExit("maca");
printf("[%ld byte] %.*sn", (long) numRead, (int) numRead, buf);
}
metu (EXIT_SUCCESS);
}
_________________________________________________________________soket/id_echo_cl.c

Ing ngisor iki minangka conto apa sing bakal kita deleng nalika mbukak server lan loro klien:

$su // Hak istimewa dibutuhake kanggo ngiket port sing dilindhungi
sandi:
# ./id_echo_sv // Server menyang mode latar mburi
# metu // Nyerah hak administrator
$ ./id_echo_cl localhost hello world // Klien iki ngirim rong datagram
[5 byte] hello // Klien nampilake respon sing ditampa saka server
[5 bita] donya
$ ./id_echo_cl localhost pamit // Klien iki ngirim siji datagram
[7 bait] pamit

Aku pengin sampeyan maca sing nyenengake)

Source: linux.org.ru