Phau ntawv "Linux API. Cov lus qhia dav dav »


Phau ntawv "Linux API. Cov lus qhia dav dav »

Nyob zoo tav su Kuv nthuav qhia rau koj saib phau ntawv "Linux API. Phau ntawv qhia dav dav” (kev txhais phau ntawv Linux Programming Interface). Nws tuaj yeem raug xaj ntawm tus tshaj tawm lub vev xaib, thiab yog tias koj siv cov cai tshaj tawm LinuxAPI , koj yuav tau txais 30% luv nqi.

Muab los ntawm cov ntaub ntawv rau kev siv:

Sockets: Server Architecture

Hauv tshooj no, peb yuav tham txog cov hauv paus ntsiab lus ntawm kev tsim cov khoom siv sib txuas thiab sib txuas, thiab tseem saib cov daemon tshwj xeeb hu ua inetd, uas ua rau nws yooj yim dua los tsim cov ntawv thov hauv Internet.

Iterative thiab parallel servers

Muaj ob hom socket-based network server architectures:

  • iterative: tus neeg rau zaub mov ua haujlwm rau cov neeg siv khoom ib zaug, ua ntej ua qhov kev thov (lossis ntau qhov kev thov) los ntawm ib tus neeg siv khoom thiab tom qab ntawd mus rau tom ntej;

  • parallel: lub server yog tsim los pab ntau tus neeg siv khoom ib txhij.

Ib qho piv txwv ntawm tus neeg rau zaub mov rov qab raws li FIFO queues twb tau nthuav tawm hauv Tshooj 44.8.

Iterative servers feem ntau tsuas yog tsim nyog nyob rau hauv cov xwm txheej uas cov neeg thov tuaj yeem ua tiav sai sai, txij li txhua tus neeg siv khoom raug yuam kom tos kom txog thaum lwm tus neeg siv khoom ua ntej nws tau txais kev pab. Ib qho xwm txheej siv rau txoj hauv kev no yog kev sib pauv ntawm ib qho kev thov thiab cov lus teb ntawm tus neeg siv khoom thiab cov neeg rau zaub mov.

Parallel servers yog qhov tsim nyog nyob rau hauv rooj plaub uas txhua qhov kev thov yuav siv sijhawm ntau los ua cov txheej txheem, lossis qhov twg cov neeg siv khoom thiab cov neeg rau zaub mov koom nrog kev sib pauv lus ntev. Hauv tshooj no, peb yuav tsom mus rau cov kev cai ib txwm muaj (thiab yooj yim tshaj) ntawm kev tsim cov servers sib npaug, uas yog tsim cov txheej txheem me me rau txhua tus neeg siv khoom tshiab. Cov txheej txheem no ua tiav txhua txoj haujlwm los ua haujlwm rau cov neeg siv khoom thiab tom qab ntawd xaus. Vim tias txhua tus txheej txheem no ua haujlwm ntawm nws tus kheej, nws tuaj yeem ua haujlwm rau ntau tus neeg siv khoom ib txhij. Lub luag haujlwm tseem ceeb ntawm cov txheej txheem neeg rau zaub mov tseem ceeb (niam txiv) yog los tsim ib tus menyuam cais rau txhua tus neeg siv khoom tshiab (xws li, xov ntawm kev ua tiav tuaj yeem tsim tsis yog cov txheej txheem).

Hauv cov ntu hauv qab no, peb yuav saib cov piv txwv ntawm kev rov ua dua thiab sib npaug hauv internet socket servers. Ob lub servers no siv cov qauv yooj yim ntawm kev pabcuam ncha (RFC 862), uas xa rov qab ib daim qauv ntawm cov lus xa mus rau nws los ntawm tus neeg siv khoom.

Iterative UDP server ncha

Hauv qhov no thiab ntu tom ntej peb yuav qhia cov servers rau kev pabcuam ncha. Nws muaj nyob rau ntawm chaw nres nkoj naj npawb 7 thiab ua haujlwm dhau UDP thiab TCP (qhov chaw nres nkoj no tau tshwj tseg, thiab yog li ntawd lub ncha server yuav tsum tau khiav nrog cov cai tswj hwm).

Lub ncha UDP neeg rau zaub mov tsis tu ncua nyeem cov ntaub ntawv thiab xa cov ntawv luam ntawm lawv mus rau tus neeg xa khoom. Txij li thaum tus neeg rau zaub mov tsuas yog yuav tsum tau ua cov lus ntawm ib lub sijhawm, ib qho kev rov ua dua tshiab yuav txaus. Cov ntaub ntawv header rau cov servers tau pom nyob rau hauv Daim Ntawv Teev Npe 56.1.

Sau npe 56.1. Header file rau cov kev pab cuam id_echo_sv.c thiab id_echo_cl.c

# suav nrog "inet_sockets.h" /* Tshaj tawm peb lub qhov (socket functions) */
#include "tlpi_hdr.h"

#define SERVICE "echo" /* UDP service name */

#define BUF_SIZE 500 /* Qhov loj tshaj plaws ntawm datagrams uas
tuaj yeem nyeem los ntawm tus neeg siv khoom thiab server * /
______________________________________________________________________________________________________________________________________ ____ __

Cov npe 56.2 qhia txog kev siv server. Cov ntsiab lus hauv qab no yog tsim nyog sau cia:

  • muab cov neeg rau zaub mov rau hauv daemon hom, peb siv lub becomeDaemon() muaj nuj nqi los ntawm ntu 37.2;

  • ua kom cov kev pab cuam ntau compact, peb siv lub tsev qiv ntawv rau kev ua hauj lwm nrog Internet domain sockets, tsim nyob rau hauv seem 55.12;

  • yog tias tus neeg rau zaub mov tsis tuaj yeem rov qab teb rau tus neeg siv khoom, nws sau cov lus rau lub cav siv syslog() hu.

Hauv daim ntawv thov tiag tiag, peb yuav muaj qee qhov kev txwv ntawm qhov zaus ntawm kev kaw lus siv syslog(). Qhov no yuav tshem tawm qhov muaj peev xwm ntawm tus neeg tawm tsam dhau ntawm lub kaw lus. Tsis tas li ntawd, tsis txhob hnov ​​​​qab tias txhua qhov hu rau syslog() yog kim heev, vim nws siv fsync() los ntawm lub neej ntawd.

Sau npe 56.2. Iteration server uas siv UDP ncha kev pabcuam

__________________________________________________________________sockets/id_echo_sv.c
# suav nrog
# suav nrog "id_echo.h"
# suav nrog "become_daemon.h"

rau cov menyuam
main(int argc, char *argv[])
{
koj sfd;.
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];

yog tias (becomeDaemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
yog tias (sfd == -1) {
syslog(LOG_ERR, "Tsis tuaj yeem tsim server socket (%s)",
strerror(errno));
tawm (EXIT_FAILURE);

/* Tau txais datagrams thiab xa cov ntawv luam ntawm lawv mus rau cov neeg xa khoom */
}
rau (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

yog tias (numRead == -1)
errExit("recvfrom");
if (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "Yuam kev echoing teb rau %s (%s)",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
__________________________________________________________________sockets/id_echo_sv.c

Txhawm rau kuaj cov neeg rau zaub mov ua haujlwm, peb siv qhov program los ntawm Kev Sau Npe 56.3. Nws kuj siv lub tsev qiv ntawv rau kev ua hauj lwm nrog Internet domain sockets, tsim nyob rau hauv seem 55.12. Raws li thawj kab lus sib cav, tus neeg siv khoom siv lub npe ntawm lub network node uas tus neeg rau zaub mov nyob. Tus neeg siv nkag mus rau ib lub voj uas nws xa txhua qhov kev sib cav ntxiv mus rau lub server raws li cov ntaub ntawv cais, thiab tom qab ntawd nyeem thiab luam cov datagrams nws tau txais los ntawm cov neeg rau zaub mov teb.

Sau npe 56.3. Client rau UDP ncha kev pabcuam

# suav nrog "id_echo.h"

rau cov menyuam
main(int argc, char *argv[])
{
koj sfd,j;.
size_t len;
ssize_t numRead;
char buf[BUF_SIZE];

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

/* Tsim qhov chaw nyob server raws li thawj kab lus sib cav */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
yog tias (sfd == -1)
fatal("Tsis tuaj yeem txuas rau lub qhov (socket)");

/* Xa cov lus sib cav ntxiv rau tus neeg rau zaub mov hauv daim ntawv cais cov datagrams */
rau (j = 2; j < argc; j++) {
len = strlen(argv[j]);
if (srite(sfd, argv[j], len) != len)
fatal("ib nrab/failed sau");

numRead = read(sfd, buf, BUF_SIZE);
yog tias (numRead == -1)
errExit("nyeem");
printf("[%ld bytes] %.*sn", (long) numRead, (int) numRead, buf);
}
tawm (EXIT_SUCCESS);
}
__________________________________________________________________sockets/id_echo_cl.c

Hauv qab no yog ib qho piv txwv ntawm qhov peb yuav pom thaum khiav lub server thiab ob tus neeg siv khoom:

$su // Cov cai yuav tsum tau khi rau qhov chaw nres nkoj tshwj tseg
Lo lus zais:
# ./id_echo_sv // Server mus rau hauv hom keeb kwm yav dhau
# tawm // Muab cov cai tswj hwm
$ ./id_echo_cl localhost nyob zoo ntiaj teb // Tus neeg siv khoom no xa ob datagrams
[5 bytes] nyob zoo // Tus neeg siv khoom qhia cov lus teb tau txais los ntawm lub server
[5 bytes] ntiaj teb
$ ./id_echo_cl localhost goodbye // Tus neeg siv khoom no xa ib datagram
[7 bytes] nyob zoo

Kuv xav kom koj nyeem ntawv zoo)

Tau qhov twg los: linux.org.ru ua