Buka "Linux API. Tataiso e phethahetseng"


Buka "Linux API. Tataiso e phethahetseng"

Lumelang Ke u tsebisa buka ea "Linux API. Tataiso e akaretsang" (phetolelo ea buka Sesebelisoa sa Linux Programming). E ka laeloa webosaeteng ea mohatisi, 'me haeba u sebelisa khoutu ea papatso LinuxAPI , o tla fumana theolelo ea 30%.

Nopolo e tsoang bukeng bakeng sa litšupiso:

Sockets: Mehaho ea Seva

Khaolong ena, re tla tšohla lintlha tsa motheo tsa ho qapa li-server tsa iterative le tse tšoanang, hape re shebe daemon e khethehileng e bitsoang inetd, e leng ho nolofalletsang ho etsa lisebelisoa tsa marang-rang tsa Inthanete.

Li-server tse pheta-phetoang le tse bapileng

Ho na le meralo e 'meli e tloaelehileng ea li-server tse thehiloeng ho socket:

  • iterative: seva se sebeletsa bareki ka nako e le 'ngoe, pele se sebetsa kopo (kapa likopo tse' maloa) ho tsoa ho moreki a le mong ebe se fetela ho se latelang;

  • parallel: seva e etselitsoe ho sebeletsa bareki ba bangata ka nako e le 'ngoe.

Mohlala oa seva e pheta-phetoang e ipapisitseng le mela ea FIFO e se e hlahisitsoe Karolong ea 44.8.

Li-server tse pheta-phetoang hangata li loketse feela maemong ao likopo tsa bareki li ka sebetsoang ka potlako, kaha moreki e mong le e mong o qobelloa ho ema ho fihlela bareki ba bang ba ka pele ho eona ba se ba sebelelitsoe. Taba e tloaelehileng ea tšebeliso ea mokhoa ona ke phapanyetsano ea likopo tse le 'ngoe le likarabo pakeng tsa mofani le seva.

Li-server tse tšoanang li loketse maemong ao kopo e 'ngoe le e' ngoe e nkang nako e ngata ea ho sebetsa, kapa moo mofani le seva ba kopanelang lipuisanong tse telele tsa melaetsa. Khaolong ena, re tla shebana haholo le mokhoa oa setso (le o bonolo) oa ho theha li-server tse tšoanang, e leng ho theha ts'ebetso e arohaneng ea ngoana bakeng sa moreki e mong le e mong e mocha. Ts'ebetso ena e etsa mosebetsi oohle oa ho sebeletsa moreki ebe e fela. Hobane e 'ngoe le e' ngoe ea mekhoa ena e sebetsa e ikemetseng, hoa khoneha ho sebeletsa bareki ba bangata ka nako e le 'ngoe. Mosebetsi o ka sehloohong oa ts'ebetso ea mantlha ea seva (motsoali) ke ho theha ngoana ea arohaneng bakeng sa moreki e mong le e mong e mocha (ka mokhoa o mong, likhoele tsa ts'ebetso li ka etsoa ho fapana le lits'ebetso).

Likarolong tse latelang, re tla sheba mehlala ea li-server tsa iterative le tse tšoanang tsa marang-rang. Li-server tsena tse peli li kenya tšebetsong mofuta o nolofalitsoeng oa tšebeletso ea echo (RFC 862), e khutlisetsang kopi ea molaetsa ofe kapa ofe o rometsoeng ho eona ke moreki.

Echo ea seva ea UDP e pheta-phetoang

Karolong ena le e latelang re tla hlahisa li-server tsa tšebeletso ea echo. E fumaneha ho nomoro ea boema-kepe ea 7 mme e sebetsa ho feta UDP le TCP (kou ena e bolokiloe, ka hona seva sa echo se tlameha ho tsamaisoa ka litokelo tsa motsamaisi).

Seva ea echo UDP e lula e bala li-datagrams ebe e khutlisetsa likopi tsa tsona ho motho ea li romelang. Kaha seva se hloka feela ho sebetsana le molaetsa o le mong ka nako, mohaho o pheta-phetoang o tla lekana. Faele e ka sehloohong ea li-server e bonts'itsoe lethathamong la 56.1.

Lethathamo la 56.1. Faele e ka sehloohong bakeng sa mananeo a id_echo_sv.c le id_echo_cl.c

#kenyelletsa "inet_sockets.h" /* E phatlalatsa mesebetsi ea rona ea sokete */
#kenyelletsa "tlpi_hdr.h"

#define SERVICE "echo" /* Lebitso la ts'ebeletso ea UDP */

#define BUF_SIZE 500 /* Boholo ba boholo ba datagrams bo ka
e ka baloa ke moreki le seva */
______________________________________________________________________________________ sockets/id_echo.h

Lethathamo la 56.2 le bonts'a ts'ebetsong ea seva. Lintlha tse latelang li bohlokoa ho elelloa:

  • ho kenya seva ka mokhoa oa daemon, re sebelisa mosebetsi oa becomeDaemon () ho tloha karolong ea 37.2;

  • ho etsa hore lenaneo le kopane haholoanyane, re sebelisa laeborari bakeng sa ho sebetsa le li-sockets tsa marang-rang, tse ntlafalitsoeng karolong ea 55.12;

  • haeba seva e sitoa ho khutlisetsa karabo ho mofani, e ngola molaetsa ho log e sebelisa mohala oa syslog ().

Ts'ebetsong ea 'nete, re ka beha moeli ho makhetlo a mangata a melaetsa ea ho rema lifate re sebelisa syslog(). Sena se ne se tla felisa monyetla oa hore mohlaseli a tlōle tlaleho ea tsamaiso. Ntle le moo, u seke oa lebala hore mohala o mong le o mong ho syslog() o turu haholo, kaha o sebelisa fsync() ka boiketsetso.

Lethathamo la 56.2. Seva ea ho pheta-pheta e sebelisang tšebeletso ea UDP echo

________________________________________________________________________________ sockets/id_echo_sv.c
# kenyeletsa
#kenyelletsa "id_echo.h"
# kenyeletsa "becom_daemon.h"

eth
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];

haeba (ebaDaemon(0) == -1)
errExit ("ebaDaemon");

sfd = inetBind(TŠEBELETSO, SOCK_DGRAM, NULL);
haeba (sfd == -1) {
syslog(LOG_ERR, "Ha e khone ho theha sokete ea seva (%s)",
strerror(errno));
tsoa(EXIT_FAILURE);

/* Fumana li-datagrams 'me u khutlisetse likopi tsa tsona ho ba rometseng */
}
bakeng sa (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

haeba (paloRead == -1)
errExit("recvfrom");
haeba (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= paloE bale)
syslog(LOG_WARNING, "Phoso ha re araba %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
________________________________________________________________________________ sockets/id_echo_sv.c

Ho leka ts'ebetso ea seva, re sebelisa lenaneo ho tsoa Lethathamong la 56.3. E boetse e sebelisa laeborari bakeng sa ho sebetsa le li-sockets tsa marang-rang, tse ntlafalitsoeng karolong ea 55.12. E le khang ea pele ea mola oa taelo, lenaneo la bareki le nka lebitso la node ea marang-rang eo seva e leng ho eona. Moreki o kenya loop moo e romellang e 'ngoe le e' ngoe ea likhang tse setseng ho seva e le li-datagrams tse arohaneng, ebe o bala le ho hatisa li-datagrams tseo a li fumanang ho tswa ho seva ho arabela.

Lethathamo la 56.3. Moreki oa tšebeletso ea UDP echo

#kenyelletsa "id_echo.h"

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

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

/* Theha aterese ea seva ho latela khang ea pele ea mola oa taelo */
sfd = inetConnect(argv[1], TŠEBELETSO, SOCK_DGRAM);
haeba (sfd == -1)
fatal("Ha e khone ho hokela soketeng ea seva");

/* Romella likhang tse setseng ho seva ka mokhoa oa li-datagram tse arohaneng */
bakeng sa (j = 2; j <argc; j++) {
len = strlen(argv[j]);
haeba (ngola(sfd, argv[j], len) != len)
fatal("ngola e sa fellang/e hlolehileng");

numRead = bala(sfd, buf, BUF_SIZE);
haeba (paloRead == -1)
errExit("bala");
printf("[%ld bytes] %.*sn", (bolelele) numRead, (int) numRead, buf);
}
tsoa(EXIT_SUCCESS);
}
________________________________________________________________________________ sockets/id_echo_cl.c

Ka tlase ke mohlala oa seo re tla se bona ha re tsamaisa seva le maemo a mabeli a bareki:

$su // Litokelo lia hlokahala ho tlama boema-kepe bo boloketsoeng
Password:
# ./id_echo_sv // Seva e kena boemong ba bokamorao
# tsoa // Ho tlohella litokelo tsa batsamaisi
$ ./id_echo_cl localhost hello world // Moreki enoa o romela li-datagram tse peli
[5 bytes] hello // Moreki o bonts'a karabo e amohetsoeng ho tsoa ho seva
[li-byte tse 5] lefats'e
$ ./id_echo_cl localhost sala hantle // Moreki enoa o romela datagram e le 'ngoe
[7 li-byte] sala hantle

Ke u lakaletsa 'malo o monate)

Source: linux.org.ru