బుక్ “Linux API. సమగ్ర మార్గదర్శి"


బుక్ “Linux API. సమగ్ర మార్గదర్శి"

శుభ మద్యాహ్నం నేను మీ దృష్టికి “Linux API” పుస్తకాన్ని అందిస్తున్నాను. సమగ్ర గైడ్" (పుస్తకం యొక్క అనువాదం Linux ప్రోగ్రామింగ్ ఇంటర్‌ఫేస్) మీరు ప్రచార కోడ్‌ని వర్తింపజేస్తే, దానిని ప్రచురణకర్త వెబ్‌సైట్‌లో ఆర్డర్ చేయవచ్చు LinuxAPI , మీరు 30% తగ్గింపును అందుకుంటారు.

సూచన కోసం పుస్తకం నుండి సారాంశం:

సాకెట్లు: సర్వర్ ఆర్కిటెక్చర్

ఈ అధ్యాయంలో, మేము పునరుక్తి మరియు సమాంతర సర్వర్‌ల రూపకల్పన యొక్క ప్రాథమికాలను చర్చిస్తాము మరియు ఇంటర్నెట్ సర్వర్ అప్లికేషన్‌లను సృష్టించడాన్ని సులభతరం చేసే inetd అనే ప్రత్యేక డెమోన్‌ను కూడా పరిశీలిస్తాము.

పునరావృత మరియు సమాంతర సర్వర్లు

రెండు సాధారణ సాకెట్-ఆధారిత నెట్‌వర్క్ సర్వర్ ఆర్కిటెక్చర్‌లు ఉన్నాయి:

  • పునరుక్తి: సర్వర్ క్లయింట్‌లకు ఒక్కొక్కటిగా సేవలు అందజేస్తుంది, ముందుగా ఒక క్లయింట్ నుండి అభ్యర్థనను (లేదా అనేక అభ్యర్థనలను) ప్రాసెస్ చేసి తర్వాత తదుపరిదానికి వెళ్లడం;

  • సమాంతరంగా: సర్వర్ బహుళ క్లయింట్‌లకు ఏకకాలంలో అందించడానికి రూపొందించబడింది.

FIFO క్యూల ఆధారంగా పునరావృత సర్వర్ యొక్క ఉదాహరణ ఇప్పటికే విభాగం 44.8లో ప్రదర్శించబడింది.

క్లయింట్ అభ్యర్థనలు చాలా త్వరగా ప్రాసెస్ చేయబడే పరిస్థితులలో మాత్రమే పునరుక్తి సర్వర్‌లు సాధారణంగా సరిపోతాయి, ఎందుకంటే ప్రతి క్లయింట్ దాని ముందు ఉన్న ఇతర క్లయింట్‌లకు అందించబడే వరకు వేచి ఉండవలసి వస్తుంది. క్లయింట్ మరియు సర్వర్ మధ్య ఒకే అభ్యర్థనలు మరియు ప్రతిస్పందనల మార్పిడి ఈ విధానం కోసం ఒక సాధారణ ఉపయోగ సందర్భం.

ప్రతి అభ్యర్థనను ప్రాసెస్ చేయడానికి గణనీయమైన సమయం తీసుకునే సందర్భాల్లో లేదా క్లయింట్ మరియు సర్వర్ సుదీర్ఘ సందేశ మార్పిడిలో నిమగ్నమైన సందర్భాల్లో సమాంతర సర్వర్లు అనుకూలంగా ఉంటాయి. ఈ అధ్యాయంలో, మేము ప్రధానంగా సమాంతర సర్వర్‌లను రూపొందించే సాంప్రదాయ (మరియు సరళమైన) మార్గంపై దృష్టి పెడతాము, ఇది ప్రతి కొత్త క్లయింట్ కోసం ప్రత్యేక చైల్డ్ ప్రాసెస్‌ను రూపొందించడం. ఈ ప్రక్రియ క్లయింట్‌కు సేవ చేయడానికి అన్ని పనిని నిర్వహిస్తుంది మరియు తర్వాత ముగుస్తుంది. ఈ ప్రక్రియలు ప్రతి ఒక్కటి స్వతంత్రంగా పని చేస్తున్నందున, బహుళ క్లయింట్‌లకు ఏకకాలంలో సేవ చేయడం సాధ్యపడుతుంది. ప్రధాన సర్వర్ ప్రక్రియ (తల్లిదండ్రులు) యొక్క ప్రధాన పని ప్రతి కొత్త క్లయింట్ కోసం ఒక ప్రత్యేక చైల్డ్‌ను సృష్టించడం (ప్రత్యామ్నాయంగా, ప్రక్రియలకు బదులుగా అమలు యొక్క థ్రెడ్‌లను సృష్టించవచ్చు).

కింది విభాగాలలో, మేము పునరావృత మరియు సమాంతర ఇంటర్నెట్ డొమైన్ సాకెట్ సర్వర్‌ల ఉదాహరణలను పరిశీలిస్తాము. ఈ రెండు సర్వర్‌లు ఎకో సర్వీస్ (RFC 862) యొక్క సరళీకృత సంస్కరణను అమలు చేస్తాయి, ఇది క్లయింట్ ద్వారా పంపిన ఏదైనా సందేశం యొక్క కాపీని అందిస్తుంది.

పునరావృత UDP సర్వర్ ప్రతిధ్వని

ఇందులో మరియు తదుపరి విభాగంలో మేము ఎకో సేవ కోసం సర్వర్‌లను పరిచయం చేస్తాము. ఇది పోర్ట్ నంబర్ 7లో అందుబాటులో ఉంది మరియు UDP మరియు TCP రెండింటిలోనూ పని చేస్తుంది (ఈ పోర్ట్ రిజర్వ్ చేయబడింది మరియు అందువల్ల ఎకో సర్వర్ తప్పనిసరిగా నిర్వాహక అధికారాలతో అమలు చేయబడాలి).

ప్రతిధ్వని UDP సర్వర్ డేటాగ్రామ్‌లను నిరంతరం చదువుతుంది మరియు పంపినవారికి వాటి కాపీలను అందిస్తుంది. సర్వర్‌కు ఒక సమయంలో ఒక సందేశాన్ని మాత్రమే ప్రాసెస్ చేయాల్సి ఉంటుంది కాబట్టి, ఒక పునరుక్తి నిర్మాణం సరిపోతుంది. సర్వర్‌ల కోసం హెడర్ ఫైల్ జాబితా 56.1లో చూపబడింది.

జాబితా 56.1. id_echo_sv.c మరియు id_echo_cl.c ప్రోగ్రామ్‌ల కోసం హెడర్ ఫైల్

#include "inet_sockets.h" /* మా సాకెట్ యొక్క విధులను ప్రకటిస్తుంది */
#"tlpi_hdr.h"ని చేర్చండి

#SERVICE "ఎకో"ని నిర్వచించండి /* UDP సేవ పేరు */

#BUF_SIZE 500 /* డేటాగ్రామ్‌ల గరిష్ట పరిమాణాన్ని నిర్వచించండి
క్లయింట్ మరియు సర్వర్ ద్వారా చదవవచ్చు */
_________________________________________________________________ సాకెట్లు/ID_ECHO.H

జాబితా 56.2 సర్వర్ అమలును చూపుతుంది. కింది అంశాలను గమనించడం విలువ:

  • సర్వర్‌ను డెమోన్ మోడ్‌లో ఉంచడానికి, మేము సెక్షన్ 37.2 నుండి becomeDaemon() ఫంక్షన్‌ని ఉపయోగిస్తాము;

  • ప్రోగ్రామ్‌ను మరింత కాంపాక్ట్ చేయడానికి, మేము సెక్షన్ 55.12లో అభివృద్ధి చేసిన ఇంటర్నెట్ డొమైన్ సాకెట్‌లతో పని చేయడానికి లైబ్రరీని ఉపయోగిస్తాము;

  • సర్వర్ క్లయింట్‌కు ప్రతిస్పందనను అందించలేకపోతే, అది syslog() కాల్‌ని ఉపయోగించి లాగ్‌కు సందేశాన్ని వ్రాస్తుంది.

నిజమైన అప్లికేషన్‌లో, మేము syslog()ని ఉపయోగించి సందేశాలను లాగింగ్ చేసే ఫ్రీక్వెన్సీపై కొంత పరిమితిని విధించవచ్చు. ఇది సిస్టమ్ లాగ్‌ను అటాకర్ ఓవర్‌ఫ్లో చేసే అవకాశాన్ని తొలగిస్తుంది. అదనంగా, syslog()కి చేసే ప్రతి కాల్ చాలా ఖరీదైనదని మర్చిపోవద్దు, ఎందుకంటే ఇది డిఫాల్ట్‌గా fsync()ని ఉపయోగిస్తుంది.

జాబితా 56.2. UDP ఎకో సేవను అమలు చేసే పునరావృత సర్వర్

__________________________________________________________________________________________________________________________________________________________________sockets/id_echo_sv.c
#చేర్చండి
#"id_echo.h"ని చేర్చండి
#"become_daemon.h"ని చేర్చండి

పూర్ణాంకానికి
ప్రధాన (int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t లెన్;
నిర్మాణం sockaddr_storage claddr;
చార్ బఫ్[BUF_SIZE];
చార్ addrStr[IS_ADDR_STR_LEN];

అయితే (బీకమ్ డామన్(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
అయితే (sfd == -1) {
syslog(LOG_ERR, "సర్వర్ సాకెట్ (%s)ని సృష్టించడం సాధ్యం కాలేదు",
స్ట్రెరర్ (ఎర్ర్నో));
నిష్క్రమించు (EXIT_FAILURE);

/* డేటాగ్రామ్‌లను స్వీకరించండి మరియు వాటి కాపీలను పంపినవారికి తిరిగి ఇవ్వండి */
}
కోసం (;;) {
len = sizeof(sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

ఉంటే (సంఖ్య చదవండి == -1)
errExit("recvfrom");
అయితే (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!= numRead)
syslog(LOG_WARNING, "%s (%s)కి ప్రతిస్పందన ప్రతిధ్వనించడంలో లోపం",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
స్ట్రెరర్ (ఎర్ర్నో));
}
}
__________________________________________________________________________________________________________________________________________________________________sockets/id_echo_sv.c

సర్వర్ యొక్క ఆపరేషన్‌ను పరీక్షించడానికి, మేము జాబితా 56.3 నుండి ప్రోగ్రామ్‌ను ఉపయోగిస్తాము. ఇది సెక్షన్ 55.12లో అభివృద్ధి చేయబడిన ఇంటర్నెట్ డొమైన్ సాకెట్‌లతో పని చేయడానికి లైబ్రరీని కూడా ఉపయోగిస్తుంది. మొదటి కమాండ్ లైన్ వాదనగా, క్లయింట్ ప్రోగ్రామ్ సర్వర్ ఉన్న నెట్‌వర్క్ నోడ్ పేరును తీసుకుంటుంది. క్లయింట్ ఒక లూప్‌లోకి ప్రవేశిస్తుంది, అక్కడ మిగిలిన ప్రతి ఆర్గ్యుమెంట్‌లను ప్రత్యేక డేటాగ్రామ్‌లుగా సర్వర్‌కు పంపుతుంది, ఆపై ప్రతిస్పందనగా సర్వర్ నుండి స్వీకరించే డేటాగ్రామ్‌లను చదివి ప్రింట్ చేస్తుంది.

జాబితా 56.3. UDP ఎకో సేవ కోసం క్లయింట్

#"id_echo.h"ని చేర్చండి

పూర్ణాంకానికి
ప్రధాన (int argc, char *argv[])
{
int sfd, j;
సైజు_టి లెన్;
ssize_t numRead;
చార్ బఫ్[BUF_SIZE];

అయితే (argc < 2 || strcmp(argv[1], "--help") == 0)
UseErr("%s హోస్ట్ msg...n", argv[0]);

/* మొదటి కమాండ్ లైన్ వాదన ఆధారంగా సర్వర్ చిరునామాను రూపొందించండి */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
ఉంటే (sfd == -1)
ప్రాణాంతకం("సర్వర్ సాకెట్‌కి కనెక్ట్ కాలేదు");

/* మిగిలిన ఆర్గ్యుమెంట్‌లను ప్రత్యేక డేటాగ్రామ్‌ల రూపంలో సర్వర్‌కు పంపండి */
కోసం (j = 2; j < argc; j++) {
లెన్ = strlen(argv[j]);
ఉంటే (వ్రాయండి(sfd, argv[j], len) != len)
ప్రాణాంతకం("పాక్షిక/విఫలమైన వ్రాయడం");

numRead = చదవండి(sfd, buf, BUF_SIZE);
ఉంటే (సంఖ్య చదవండి == -1)
errExit ("చదవండి");
printf("[%ld బైట్లు] %.*sn", (పొడవైన) numRead, (int) numRead, buf);
}
నిష్క్రమించు (EXIT_SUCCESS);
}
____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________sockets/id_echo_cl.c

సర్వర్ మరియు రెండు క్లయింట్ ఉదంతాలను అమలు చేస్తున్నప్పుడు మనం చూసేదానికి దిగువ ఉదాహరణ:

$su // రిజర్వ్ చేయబడిన పోర్ట్‌కు కట్టుబడి ఉండటానికి ప్రత్యేకాధికారాలు అవసరం
పాస్వర్డ్:
# ./id_echo_sv // సర్వర్ బ్యాక్‌గ్రౌండ్ మోడ్‌లోకి వెళుతుంది
# నిష్క్రమించు // నిర్వాహక హక్కులను వదులుకోండి
$ ./id_echo_cl లోకల్ హోస్ట్ హలో వరల్డ్ // ఈ క్లయింట్ రెండు డేటాగ్రామ్‌లను పంపుతుంది
[5 బైట్లు] హలో // క్లయింట్ సర్వర్ నుండి స్వీకరించిన ప్రతిస్పందనను ప్రదర్శిస్తుంది
[5 బైట్లు] ప్రపంచం
$ ./id_echo_cl లోకల్ హోస్ట్ గుడ్‌బై // ఈ క్లయింట్ ఒక డేటాగ్రామ్‌ను పంపుతుంది
[7 బైట్లు] వీడ్కోలు

నేను మీకు ఆహ్లాదకరమైన పఠనాన్ని కోరుకుంటున్నాను)

మూలం: linux.org.ru