Aloha awakea, Aloha Auinalā Ke hōʻike aku nei au iā ʻoe i ka puke "Linux API. He alakaʻi piha" (unuhi o ka puke ʻO ka Linux Programming Interface). Hiki ke kauoha ʻia ma ka pūnaewele o ka mea hoʻopuka, a inā ʻoe e hoʻohana i ke code hoʻolaha LinuxAPI , e loaʻa iā ʻoe kahi hoʻemi 30%.
Wehe mai ka puke no ka ʻike:
Nā Pūnaehana: Kūlana Kūlana
Ma kēia mokuna, e kūkākūkā mākou i nā kumu o ka hoʻolālā ʻana i nā kikowaena iterative a me ka like, a e nānā pū i kahi daemon kūikawā i kapa ʻia ʻo inetd, kahi e maʻalahi ai ka hana ʻana i nā noi kikowaena pūnaewele.
Nā kikowaena hoʻololi a me ka like
ʻElua mau papa hana kikowaena pūnaewele maʻamau.
-
hoʻololi: lawelawe ke kikowaena i nā mea kūʻai aku i kēlā me kēia manawa, e hana mua i kahi noi (a i ʻole kekahi mau noi) mai kekahi mea kūʻai aku a laila neʻe i kahi aʻe;
-
parallel: ua hoʻolālā ʻia ke kikowaena e lawelawe i nā mea kūʻai aku i ka manawa like.
Ua hōʻike mua ʻia kahi hiʻohiʻona o kahi kikowaena iterative e pili ana i nā queues FIFO ma ka Pauku 44.8.
He kūpono wale nō nā kikowaena Iterative i nā kūlana kahi e hiki ai ke hoʻokō koke ʻia nā noi o nā mea kūʻai aku, no ka mea e koi ʻia kēlā me kēia mea kūʻai aku e kali a lawelawe ʻia nā mea kūʻai aku ma mua. ʻO kahi hihia hoʻohana maʻamau no kēia ala ʻo ka hoʻololi ʻana i nā noi hoʻokahi a me nā pane ma waena o kahi mea kūʻai aku a me kahi kikowaena.
Ua kūpono nā kikowaena Parallel i nā hihia kahi e nui ai ka manawa o kēlā me kēia noi e hana ai, a i ʻole kahi e komo ai ka mea kūʻai aku a me ke kikowaena i nā hoʻololi memo lōʻihi. Ma kēia mokuna, e kālele nui mākou i ke ala kuʻuna (a maʻalahi loa) o ka hoʻolālā ʻana i nā kikowaena like, ʻo ia hoʻi ka hana ʻana i kahi kaʻina keiki kaʻawale no kēlā me kēia mea kūʻai aku. Hana kēia hana i nā hana a pau e lawelawe i ka mea kūʻai aku a laila hoʻopau. Ma muli o ka hana kūʻokoʻa o kēlā me kēia kaʻina hana, hiki ke lawelawe i nā mea kūʻai aku he nui i ka manawa like. ʻO ka hana nui o ke kaʻina kikowaena nui (makua) ʻo ia ka hana ʻana i kahi keiki kaʻawale no kēlā me kēia mea kūʻai hou (ʻo ia hoʻi, hiki ke hana ʻia nā kaula o ka hoʻokō ma mua o nā kaʻina hana).
Ma nā ʻāpana aʻe, e nānā mākou i nā hiʻohiʻona o ka iterative a me ka parallel pūnaewele pūnaewele socket servers. Hoʻokomo kēia mau kikowaena ʻelua i kahi mana maʻalahi o ka lawelawe echo (RFC 862), e hoʻihoʻi i kahi kope o nā leka i hoʻouna ʻia e ka mea kūʻai aku.
ʻO ke kani ʻana o ke kikowaena UDP
Ma kēia a me ka ʻāpana aʻe e hoʻolauna mākou i nā kikowaena no ka lawelawe echo. Loaʻa ia ma ka helu awa 7 a hana ma luna o ka UDP a me TCP (ua mālama ʻia kēia awa, a no laila pono e holo ka server echo me nā kuleana luna).
Heluhelu mau ke kikowaena UDP echo i nā datagrams a hoʻihoʻi i nā kope o ia mau mea i ka mea hoʻouna. No ka mea e pono ana ke kikowaena e hoʻoponopono i hoʻokahi memo i ka manawa, e lawa ana ka hoʻolālā iterative. Hōʻike ʻia ka faila poʻomanaʻo no nā kikowaena ma ka papa inoa 56.1.
Papa inoa 56.1. Waihona poʻomanaʻo no nā polokalamu id_echo_sv.c a me id_echo_cl.c
#include "inet_sockets.h" /* Hōʻike i nā hana o kā mākou kumu */
#include "tlpi_hdr.h"
#define SERVICE "echo" /* inoa lawelawe UDP */
#define BUF_SIZE 500 /* Ka nui kiʻekiʻe o nā kiʻi ʻikepili
hiki ke heluhelu ʻia e ka mea kūʻai aku a me ke kikowaena */
_____________________________________________________________________sockets/id_echo.h
Hōʻike ka papa inoa 56.2 i ka hoʻokō kikowaena. Pono e hoʻomaopopo i kēia mau mea:
-
e hoʻokomo i ke kikowaena i ke ʻano daemon, hoʻohana mākou i ka hana becomeDaemon() mai ka pauku 37.2;
-
no ka hoʻomāhuahua ʻana i ka papahana, hoʻohana mākou i ka waihona no ka hana ʻana me nā kumu kikowaena pūnaewele, i kūkulu ʻia ma ka pauku 55.12;
-
inā ʻaʻole hiki i ke kikowaena ke hoʻihoʻi i kahi pane i ka mea kūʻai aku, kākau ia i kahi leka i ka log me ka hoʻohana ʻana i ka syslog() kelepona.
Ma kahi noi maoli, e kau paha mākou i kekahi palena i ka alapine o ka hoʻopaʻa ʻana i nā leka me ka syslog(). E hoʻopau kēia i ka hiki ʻana o kahi mea hoʻouka kaua e hoʻopiha i ka log system. Eia kekahi, mai poina i kēlā me kēia kelepona i ka syslog() he kumukūʻai nui, no ka mea, hoʻohana ʻo ia i ka fsync() ma ke ʻano maʻamau.
Papa inoa 56.2. Hoʻohana ʻia ka server e hoʻokō i ka lawelawe echo UDP
_________________________________________________________________sockets/id_echo_sv.c
#hoʻokomo
#include "id_echo.h"
#include "become_daemon.h"
INT
nui(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];
inā (e lilo ʻoDaemon(0) == -1)
errExit("becomeDaemon");
sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
inā (sfd == -1) {
syslog(LOG_ERR, "ʻAʻole hiki ke hana i ke kumu kikowaena (%s)",
strerror(errno));
puka (EXIT_FAILURE);
/* Loaʻa i nā datagrams a hoʻihoʻi i nā kope o ia mau mea i nā mea hoʻouna */
}
no (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);
inā (numRead == -1)
errExit("recvmai");
inā (hoʻouna (sfd, buf, numRead, 0, (struct sockaddr *) & claddr, len)
!= heluRead)
syslog(LOG_WARNING, "Hāhewa ke kani ʻana i ka pane iā %s (%s)",
inetAddressStr((struct sockaddr *) & claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c
No ka hoʻāʻo ʻana i ka hana a ke kikowaena, hoʻohana mākou i ka papahana mai Listing 56.3. Hoʻohana pū ia i ka waihona no ka hana ʻana me nā kumu kikowaena pūnaewele, i kūkulu ʻia ma ka pauku 55.12. E like me ka hoʻopaʻapaʻa laina kauoha mua, lawe ka polokalamu mea kūʻai aku i ka inoa o ka node pūnaewele kahi i loaʻa ai ke kikowaena. Hoʻokomo ka mea kūʻai i kahi loop kahi e hoʻouna ai i kēlā me kēia o nā manaʻo i koe i ke kikowaena ma ke ʻano he datagrams kaʻawale, a laila heluhelu a paʻi i nā datagrams i loaʻa iā ia mai ke kikowaena ma ka pane.
Papa inoa 56.3. Mea kūʻai no ka lawelawe leo UDP
#include "id_echo.h"
INT
nui(int argc, char *argv[])
{
int sfd, j;
nui_t len;
ssize_t numRead;
char buf[BUF_SIZE];
inā (argc <2 || strcmp(argv[1], "--kōkua") == 0)
usageErr("%s host msg…n", argv[0]);
/* Hoʻokumu i ka helu kikowaena ma muli o ka hoʻopaʻapaʻa laina kauoha mua */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
inā (sfd == -1)
fatal("ʻAʻole hiki ke hoʻopili i ke kumu kikowaena");
/* E hoʻouna i nā manaʻo i koe i ke kikowaena ma ke ʻano o nā datagrams kaʻawale */
no (j = 2; j < argc; j++) {
len = strlen(argv[j]);
inā (kākau(sfd, argv[j], len) != len)
fatal("ʻāpana / hāʻule kākau");
numRead = heluhelu(sfd, buf, BUF_SIZE);
inā (numRead == -1)
errExit("heluhelu");
printf("[%ld bytes] %.*sn", (lōʻihi) numRead, (int) numRead, buf);
}
puka(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c
Aia ma lalo kahi hiʻohiʻona o ka mea a mākou e ʻike ai i ka wā e holo ana i ka server a me ʻelua mau mea kūʻai aku:
$su // Pono nā pono e hoʻopaʻa i kahi awa i mālama ʻia
Hua huna:
# ./id_echo_sv // Hele ke kikowaena i ke ʻano kāʻei kua
# puka // Hāʻawi i nā kuleana luna
$ ./id_echo_cl localhost hello world // Hoʻouna kēia mea kūʻai aku i ʻelua datagrams
[5 bytes] aloha // Hōʻike ka mea kūʻai aku i ka pane i loaʻa mai ke kikowaena
[5 bytes] honua
$ ./id_echo_cl localhost goodbye // Hoʻouna kēia mea kūʻai aku i hoʻokahi datagram
[7 bytes] aloha
Makemake wau iā ʻoe i kahi heluhelu ʻoluʻolu)
Source: linux.org.ru