புத்தகம் "லினக்ஸ் ஏபிஐ. விரிவான வழிகாட்டி »


புத்தகம் "லினக்ஸ் ஏபிஐ. விரிவான வழிகாட்டி »

மதிய வணக்கம் "லினக்ஸ் ஏபிஐ" புத்தகத்தை உங்கள் கவனத்திற்குக் கொண்டு வருகிறேன். விரிவான வழிகாட்டி "(புத்தகத்தின் மொழிபெயர்ப்பு லினக்ஸ் நிரலாக்க இடைமுகம்) விளம்பரக் குறியீட்டைப் பயன்படுத்தினால், அதை வெளியீட்டாளரின் இணையதளத்தில் ஆர்டர் செய்யலாம் LinuxAPI நீங்கள் 30% தள்ளுபடி பெறுவீர்கள்.

மதிப்பாய்வுக்காக புத்தகத்திலிருந்து ஒரு பகுதி:

சாக்கெட்டுகள்: சேவையக கட்டமைப்பு

இந்த அத்தியாயத்தில், மறுசெயல் மற்றும் இணையான சேவையகங்களை வடிவமைப்பதற்கான அடிப்படைகள் மற்றும் சேவையக பக்க இணைய பயன்பாடுகளை உருவாக்குவதற்கு உதவும் ஒரு சிறப்பு inetd டீமான் பற்றி விவாதிப்போம்.

மறு செய்கை மற்றும் இணை சேவையகங்கள்

இரண்டு பொதுவான சாக்கெட் அடிப்படையிலான நெட்வொர்க் சர்வர் கட்டமைப்புகள் உள்ளன:

  • மறு செய்கை: சேவையகம் ஒரு நேரத்தில் வாடிக்கையாளர்களுக்கு சேவை செய்கிறது, முதலில் ஒரு கிளையண்டின் கோரிக்கையை (அல்லது பல கோரிக்கைகளை) செயலாக்குகிறது, பின்னர் அடுத்தவருக்குச் செல்கிறது;

  • இணை: சேவையகம் ஒரே நேரத்தில் பல வாடிக்கையாளர்களுக்கு சேவை செய்ய வடிவமைக்கப்பட்டுள்ளது.

பிரிவு 44.8 ஏற்கனவே FIFO வரிசைகளின் அடிப்படையில் மறு செய்கை சேவையகத்தின் உதாரணத்தை வழங்கியுள்ளது.

கிளையன்ட் கோரிக்கைகள் மிக விரைவாக செயலாக்கப்படும் சூழ்நிலைகளில் மட்டுமே மறு செய்கை சேவையகங்கள் பொதுவாக பொருத்தமானவையாகும், ஏனெனில் ஒவ்வொரு கிளையண்டும் தனக்கு முன்னால் உள்ள வேறு எந்த வாடிக்கையாளர்களுக்கும் வழங்கப்படும் வரை காத்திருக்க வேண்டும். இந்த அணுகுமுறைக்கான பொதுவான பயன்பாடு ஒரு கிளையன்ட் மற்றும் சர்வர் இடையே ஒற்றை கோரிக்கைகள் மற்றும் பதில்களை பரிமாறிக்கொள்வதாகும்.

ஒவ்வொரு கோரிக்கையையும் செயல்படுத்த கணிசமான அளவு நேரம் எடுக்கும் அல்லது கிளையன்ட் மற்றும் சர்வர் செய்திகளை நீண்ட நேரம் பரிமாறிக் கொள்ளும் சந்தர்ப்பங்களில் இணை சேவையகங்கள் பொருத்தமானவை. இந்த அத்தியாயத்தில், இணை சேவையகங்களை வடிவமைப்பதற்கான பாரம்பரிய (மற்றும் எளிதான) வழியில் நாங்கள் முக்கியமாக கவனம் செலுத்துவோம், இது ஒவ்வொரு புதிய கிளையண்டிற்கும் தனி குழந்தை செயல்முறையை உருவாக்குவதாகும். அத்தகைய செயல்முறை வாடிக்கையாளருக்கு சேவை செய்யும் அனைத்து வேலைகளையும் செய்கிறது, அதன் பிறகு அது முடிவடைகிறது. இந்த செயல்முறைகள் ஒவ்வொன்றும் சுயாதீனமாக செயல்படுவதால், ஒரே நேரத்தில் பல வாடிக்கையாளர்களுக்கு சேவை செய்ய முடியும். பிரதான சேவையக செயல்முறையின் (பெற்றோர்) முக்கிய பணி ஒவ்வொரு புதிய கிளையண்டிற்கும் ஒரு தனி குழந்தையை உருவாக்குவதாகும் (மாற்றாக, செயல்முறைகளுக்கு பதிலாக, நீங்கள் செயல்படுத்தும் நூல்களை உருவாக்கலாம்).

பின்வரும் பிரிவுகளில், இணைய டொமைன் சாக்கெட்டுகளின் அடிப்படையில் செயல்படும் மற்றும் இணையான சேவையகங்களின் எடுத்துக்காட்டுகளைப் பார்ப்போம். இந்த இரண்டு சேவையகங்களும் எக்கோ சேவையின் (RFC 862) எளிமைப்படுத்தப்பட்ட பதிப்பைச் செயல்படுத்துகின்றன, அது கிளையன்ட் அனுப்பிய எந்த செய்தியின் நகலையும் வழங்குகிறது.

எதிரொலி மறு செய்கை udp சேவையகம்

இது மற்றும் அடுத்த பகுதியில், எதிரொலி சேவைக்கான சேவையகங்களை நாங்கள் அறிமுகப்படுத்துவோம். இது போர்ட் எண் 7 இல் கிடைக்கிறது மற்றும் UDP மற்றும் TCP இரண்டிலும் வேலை செய்கிறது (இந்த போர்ட் ஒதுக்கப்பட்டுள்ளது, எனவே எக்கோ சர்வர் நிர்வாகி சலுகைகளுடன் இயக்கப்பட வேண்டும்).

எதிரொலி UDP சேவையகம் தொடர்ந்து டேட்டாகிராம்களைப் படித்து, அதன் நகலை அனுப்புநருக்குத் தருகிறது. சேவையகம் ஒரு நேரத்தில் ஒரு செய்தியை மட்டுமே செயல்படுத்த வேண்டும் என்பதால், ஒரு மறுசெய்கை கட்டமைப்பு இங்கு போதுமானதாக இருக்கும். சேவையகங்களுக்கான தலைப்பு கோப்பு பட்டியல் 56.1-XNUMX இல் காட்டப்பட்டுள்ளது.

பட்டியல் 56.1. id_echo_sv.c மற்றும் id_echo_cl.c நிரல்களுக்கான தலைப்பு கோப்பு

#include "inet_sockets.h" /* எங்கள் சாக்கெட் செயல்பாடுகளை அறிவிக்கிறது */
# "tlpi_hdr.h" அடங்கும்

#சேவை "எதிரொலி" /* UDP சேவை பெயரை வரையறுக்கவும் */

#BUF_SIZE 500 /* டேட்டாகிராம்களின் அதிகபட்ச அளவை வரையறுக்கவும்
கிளையன்ட் மற்றும் சர்வர் மூலம் படிக்க முடியும் */
_____________________________________________________________________ சாக்கெட்டுகள்/id_echo.h

பட்டியல் 56.2-XNUMX சேவையக செயலாக்கத்தைக் காட்டுகிறது. பின்வரும் புள்ளிகளைக் குறிப்பிடுவது மதிப்பு:

  • சேவையகத்தை டீமான் பயன்முறையில் வைக்க, பிரிவு 37.2 இலிருந்து beDaemon() செயல்பாட்டைப் பயன்படுத்துகிறோம்;

  • நிரலை மிகவும் கச்சிதமாக மாற்ற, பிரிவு 55.12 இல் உருவாக்கப்பட்ட இணைய டொமைன் சாக்கெட் நூலகத்தைப் பயன்படுத்துகிறோம்;

  • சேவையகமானது கிளையண்டிற்கு பதில் அளிக்க முடியாவிட்டால், அது syslog() அழைப்பைப் பயன்படுத்தி பதிவுக்கு ஒரு செய்தியை எழுதுகிறது.

உண்மையான பயன்பாட்டில், syslog() ஐப் பயன்படுத்தி செய்திகளை பதிவு செய்யும் அதிர்வெண்ணில் ஒரு குறிப்பிட்ட வரம்பை நாங்கள் விதிப்போம். இது ஒரு தாக்குபவர் கணினி பதிவை நிரம்பி வழியும் வாய்ப்பை நீக்கும். மேலும், ஒவ்வொரு syslog() அழைப்பும் மிகவும் விலை உயர்ந்தது என்பதை நினைவில் கொள்ளவும், ஏனெனில் இது முன்னிருப்பாக fsync() ஐப் பயன்படுத்துகிறது.

பட்டியல் 56.2. எதிரொலி UDP சேவையை செயல்படுத்தும் மறு செய்கை சேவையகம்

_________________________________________________________________ சாக்கெட்டுகள்/ஐடி_சோ_ஸ்வ்.சி
#சேர்க்கிறது
#"id_echo.h" அடங்கும்
# "become_daemon.h" அடங்கும்

எண்ணாக
முக்கிய(int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_tlen;
ஸ்ட்ரக்ட் sockaddr_storage claddr;
charbuf[BUF_SIZE];
சார் addrStr[IS_ADDR_STR_LEN];

என்றால் (Daemon(0) == -1)
errExit("becomeDaemon");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
என்றால் (sfd == -1) {
syslog(LOG_ERR, "சர்வர் சாக்கெட்டை (%s) உருவாக்க முடியவில்லை",
strerror(errno));
வெளியேறு(EXIT_FAILURE);

/* டேட்டாகிராம்களைப் பெறவும் மற்றும் அனுப்புனர்களுக்கு நகல்களை திருப்பி அனுப்பவும் */
}
(;;) {
லென் = அளவு (sckaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);

என்றால் (எண் படிக்கவும் == -1)
errExit("recvfrom");
என்றால் (sendto(sfd, buf, numRead, 0, (struct sockaddr *) &claddr, len)
!=எண் படிக்கவும்)
syslog(LOG_WARNING, "%s (%s)க்கான பதிலை எதிரொலிப்பதில் பிழை",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________ சாக்கெட்டுகள்/ஐடி_சோ_ஸ்வ்.சி

சேவையகத்தைச் சோதிக்க 56.3 பட்டியலிடப்பட்ட நிரலைப் பயன்படுத்துகிறோம். இது பிரிவு 55.12 இல் உருவாக்கப்பட்ட இணைய டொமைன் சாக்கெட் நூலகத்தையும் பயன்படுத்துகிறது. கிளையன்ட் நிரல், சேவையகம் அமைந்துள்ள நெட்வொர்க் ஹோஸ்டின் பெயரை கட்டளை வரியில் முதல் வாதமாக எடுத்துக்கொள்கிறது. கிளையன்ட் ஒரு லூப்பில் நுழைகிறார், அங்கு மீதமுள்ள ஒவ்வொரு வாதங்களையும் தனித்தனி டேட்டாகிராம்களாக சேவையகத்திற்கு அனுப்புகிறது, பின்னர் சேவையகத்திலிருந்து பெறப்பட்ட டேட்டாகிராம்களைப் படித்து வெளியிடுகிறது.

பட்டியல் 56.3. எதிரொலி UDP சேவைக்கான வாடிக்கையாளர்

#"id_echo.h" அடங்கும்

எண்ணாக
முக்கிய(int argc, char *argv[])
{
int sfd,j;
அளவு_tlen;
ssize_t numRead;
charbuf[BUF_SIZE];

என்றால் (argc < 2 || strcmp(argv[1], "--help") == 0)
UseErr("%s host 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);
}
_________________________________________________________________ சாக்கெட்டுகள்/ஐடி_சோ_.சி.எல்.சி.

சேவையகத்தைத் தொடங்கும்போது நாம் பார்ப்பதற்குப் பின்வருபவை ஒரு எடுத்துக்காட்டு மற்றும் இரண்டு கிளையன்ட் நிகழ்வுகள்:

$ su // முன்பதிவு செய்யப்பட்ட துறைமுகத்துடன் பிணைக்க சலுகைகள் தேவை
கடவுச்சொல்:
# ./id_echo_sv // சேவையகம் பின்னணியில் செல்கிறது
# வெளியேறு // நிர்வாக உரிமைகளை கைவிடவும்
$ ./id_echo_cl லோக்கல் ஹோஸ்ட் ஹலோ வேர்ல்ட் // இந்த கிளையன்ட் இரண்டு டேட்டாகிராம்களை அனுப்புகிறது
[5 பைட்டுகள்] ஹலோ // கிளையன்ட் சேவையகத்திலிருந்து பெறப்பட்ட பதிலை வெளியிடுகிறது
[5 பைட்டுகள்] உலகம்
$ ./id_echo_cl லோக்கல் ஹோஸ்ட் குட்பை // இந்த கிளையன்ட் ஒரு டேட்டாகிராமை அனுப்புகிறது
[7 பைட்டுகள்] குட்பை

நான் உங்களுக்கு இனிமையான வாசிப்பை விரும்புகிறேன்)

ஆதாரம்: linux.org.ru