Iwe “Linux API. Itọsọna pipe"


Iwe “Linux API. Itọsọna pipe"

E kaasan Mo ṣafihan iwe “Linux API si akiyesi rẹ. Itọsọna okeerẹ" (itumọ iwe naa Ni wiwo siseto Linux). O le paṣẹ lori oju opo wẹẹbu olutẹjade, ati ti o ba lo koodu ipolowo naa LinuxAPI , o yoo gba a 30% eni.

Yiyọ lati inu iwe fun itọkasi:

Sockets: Server Architecture

Ninu ori yii, a yoo jiroro lori awọn ipilẹ ti sisọ awọn aṣetunṣe ati awọn olupin ti o jọra, ati tun wo daemon pataki kan ti a pe ni inetd, eyiti o jẹ ki o rọrun lati ṣẹda awọn ohun elo olupin Intanẹẹti.

Aṣetunṣe ati awọn olupin ti o jọra

Awọn faaji olupin nẹtiwọki ti o da lori iho meji lo wa:

  • aṣetunṣe: olupin naa n ṣe iranṣẹ fun awọn alabara ni ẹẹkan, ni akọkọ ṣiṣe ibeere kan (tabi awọn ibeere pupọ) lati ọdọ alabara kan ati lẹhinna lọ si ekeji;

  • ni afiwe: olupin ti ṣe apẹrẹ lati sin ọpọlọpọ awọn alabara ni nigbakannaa.

Apeere ti olupin aṣetunṣe ti o da lori awọn laini FIFO ti gbekalẹ tẹlẹ ni Abala 44.8.

Awọn olupin aṣetunṣe nigbagbogbo dara nikan ni awọn ipo nibiti awọn ibeere alabara le ṣe ni ilọsiwaju ni iyara, niwọn bi a ti fi agbara mu alabara kọọkan lati duro titi eyikeyi awọn alabara miiran ti o wa niwaju ti yoo ṣe iranṣẹ. Ọran lilo ti o wọpọ fun ọna yii ni paṣipaarọ awọn ibeere ẹyọkan ati awọn idahun laarin alabara ati olupin.

Awọn olupin ti o jọra dara ni awọn ọran nibiti ibeere kọọkan gba iye akoko pataki lati ṣe ilana, tabi nibiti alabara ati olupin ṣe ni awọn paṣipaarọ ifiranṣẹ gigun. Ninu ori yii, a yoo dojukọ nipataki lori ọna aṣa (ati rọrun) ti apẹrẹ awọn olupin ti o jọra, eyiti o jẹ lati ṣẹda ilana ọmọde lọtọ fun alabara tuntun kọọkan. Ilana yii ṣe gbogbo iṣẹ lati ṣe iranṣẹ alabara lẹhinna pari. Nitori ọkọọkan awọn ilana wọnyi n ṣiṣẹ ni ominira, o ṣee ṣe lati sin awọn alabara lọpọlọpọ ni nigbakannaa. Iṣẹ akọkọ ti ilana olupin akọkọ (obi) ni lati ṣẹda ọmọ lọtọ fun alabara tuntun kọọkan (ni omiiran, awọn okun ipaniyan le ṣẹda dipo awọn ilana).

Ni awọn apakan atẹle, a yoo wo awọn apẹẹrẹ ti aṣetunṣe ati awọn olupin iho aaye ayelujara ti o jọra. Awọn olupin meji wọnyi ṣe imuse ẹya irọrun ti iṣẹ iwoyi (RFC 862), eyiti o da ẹda ti ifiranṣẹ eyikeyi ti o firanṣẹ si nipasẹ alabara kan.

Iterative UDP olupin iwoyi

Ni eyi ati apakan atẹle a yoo ṣafihan awọn olupin fun iṣẹ iwoyi. O wa lori nọmba ibudo 7 ati ṣiṣẹ lori mejeeji UDP ati TCP (ibudo yii wa ni ipamọ, ati nitorinaa olupin iwoyi gbọdọ ṣiṣẹ pẹlu awọn anfani alabojuto).

Olupin UDP iwoyi n ka awọn datagram nigbagbogbo ati da awọn ẹda wọn pada si olufiranṣẹ. Niwọn igba ti olupin nikan nilo lati ṣe ilana ifiranṣẹ kan ni akoko kan, faaji aṣetunṣe yoo to. Faili akọsori fun awọn olupin naa han ni Akojọ 56.1.

Atokọ 56.1. Faili akọsori fun awọn eto id_echo_sv.c ati id_echo_cl.c

#pẹlu "inet_sockets.h" /* Ṣafihan awọn iṣẹ ti iho wa */
#pẹlu "tlpi_hdr.h"

# ṣe alaye IṣẸ “iwoyi” /* Orukọ iṣẹ UDP */

# ṣe asọye BUF_SIZE 500 /* Iwọn ti o pọju ti awọn datagram ti
le jẹ kika nipasẹ alabara ati olupin */
__________________________________________________ sockets/id_echo.h

Atokọ 56.2 fihan imuse olupin naa. Awọn aaye atẹle wọnyi jẹ akiyesi:

  • lati fi olupin naa sinu ipo daemon, a lo iṣẹ di Daemon () lati apakan 37.2;

  • lati jẹ ki eto naa pọ sii, a lo ile-ikawe fun ṣiṣẹ pẹlu awọn iho ašẹ Intanẹẹti, ti o dagbasoke ni apakan 55.12;

  • ti olupin ko ba le da esi pada si alabara, o kọ ifiranṣẹ si log nipa lilo ipe syslog ().

Ninu ohun elo gidi kan, o ṣee ṣe pe a yoo fa opin diẹ si igbohunsafẹfẹ ti awọn ifiranṣẹ gedu nipa lilo syslog (). Eyi yoo ṣe imukuro iṣeeṣe ti ikọlu kan ti o ṣan lori akọọlẹ eto naa. Ni afikun, maṣe gbagbe pe ipe kọọkan si syslog () jẹ gbowolori pupọ, nitori o nlo fsync () nipasẹ aiyipada.

Atokọ 56.2. Olupin aṣetunṣe ti o ṣe iṣẹ iwoyi UDP

__________________________________________________sockets/id_echo_sv.c
#pẹlu
#pẹlu "id_echo.h"
#pẹlu "di_daemon.h"

int
akọkọ (int argc, char *argv[])
{
int sfd;
size_t numRead;
lẹnsi socklen_t;
struct sockaddr_storage claddr;
char buf [BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

ti o ba jẹ (di Daemon (0) == -1)
errExit ("diDaemon");

sfd = inetBind (IṢẸ, SOCK_DGRAM, NULL);
ti (sfd == -1) {
syslog(LOG_ERR, "Ko le ṣẹda iho olupin (%s)",
strok (errno));
jade (EXIT_FAILURE);

/ * Gba awọn datagram ati da awọn ẹda wọn pada si awọn olufiranṣẹ */
}
fun (;;) {
lẹn = sizeof (igbekale sockaddr_storage);
numRead = recvfrom (sfd, buf, BUF_SIZE, 0, (struct sockaddr *) & claddr, & Len);

ti o ba jẹ (numRead == -1)
errExit ("recvfrom");
ti o ba jẹ (sendto (sfd, buf, numRead, 0, (sockaddr struct *) & claddr, lẹnsi)
!= numRead)
syslog (LOG_WARNING, "Asise ti n dahun esi si %s (%s)",
inetAddressStr ((sockaddr igbekalẹ *) & claddr, lẹnsi,
addrStr, IS_ADDR_STR_LEN),
strok (errno));
}
}
__________________________________________________sockets/id_echo_sv.c

Lati ṣe idanwo iṣẹ olupin, a lo eto naa lati Akojọ 56.3. O tun nlo ile-ikawe naa fun ṣiṣẹ pẹlu awọn iho aaye ayelujara, ti o dagbasoke ni apakan 55.12. Gẹgẹbi ariyanjiyan laini aṣẹ akọkọ, eto alabara gba orukọ ipade nẹtiwọki lori eyiti olupin wa. Onibara tẹ lupu kan nibiti o ti fi ọkọọkan awọn ariyanjiyan ti o ku ranṣẹ si olupin bi awọn aworan data lọtọ, ati lẹhinna ka ati tẹjade awọn datagram ti o gba lati ọdọ olupin ni idahun.

Atokọ 56.3. Onibara fun iṣẹ iwoyi UDP

#pẹlu "id_echo.h"

int
akọkọ (int argc, char *argv[])
{
int sfd, j;
lẹnsi size_t;
size_t numRead;
char buf [BUF_SIZE];

ti (argc <2 || strcmp (argv[1], "--iranlọwọ") == 0)
usageErr("%s ogun msg…n", argv[0]);

/ * Fọọmu adirẹsi olupin ti o da lori ariyanjiyan laini aṣẹ akọkọ */
sfd = inetConnect (argv [1], IṣẸ, SOCK_DGRAM);
ti o ba jẹ (sfd == -1)
apaniyan ("Ko le sopọ si iho olupin");

/ * Firanṣẹ awọn ariyanjiyan ti o ku si olupin ni irisi datagrams lọtọ */
fun (j = 2; j < argc; j++) {
lẹn = strlen (argv [j]);
ti (kọ (sfd, argv [j], len)!= len)
buburu ("apakan / kuna");

numRead = kika (sfd, buf, BUF_SIZE);
ti o ba jẹ (numRead == -1)
errExit ("ka");
printf ("[% ld awọn baiti] % * sn ", (gun) numRead, (int) numRead, buf);
}
jade (EXIT_SUCCESS);
}
__________________________________________________sockets/id_echo_cl.c

Ni isalẹ jẹ apẹẹrẹ ti ohun ti a yoo rii nigbati o nṣiṣẹ olupin ati awọn apẹẹrẹ alabara meji:

$su // Awọn anfani ni a nilo lati so mọ ibudo ti a fi pamọ
Ọrọigbaniwọle:
# ./id_echo_sv // Olupin lọ si ipo abẹlẹ
# jade // Fun awọn ẹtọ alakoso
$ ./id_echo_cl localhost hello aye // Onibara yii firanṣẹ awọn datagram meji
[5 baiti] hello // Onibara ṣe afihan esi ti o gba lati ọdọ olupin naa
[5 baiti] aye
$ ./id_echo_cl localhost o dabọ // Onibara yii fi datagram kan ranṣẹ
[7 baiti] o dabọ

Mo fẹ ki o ka kika ti o dun)

orisun: linux.org.ru