ಪುಸ್ತಕ "ಲಿನಕ್ಸ್ API. ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ"


ಪುಸ್ತಕ "ಲಿನಕ್ಸ್ API. ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ"

ಶುಭ ಅಪರಾಹ್ನ ನಾನು ನಿಮ್ಮ ಗಮನಕ್ಕೆ "ಲಿನಕ್ಸ್ API" ಪುಸ್ತಕವನ್ನು ಪ್ರಸ್ತುತಪಡಿಸುತ್ತೇನೆ. ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ" (ಪುಸ್ತಕದ ಅನುವಾದ ಲಿನಕ್ಸ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಇಂಟರ್ಫೇಸ್) ಇದನ್ನು ಪ್ರಕಾಶಕರ ವೆಬ್‌ಸೈಟ್‌ನಲ್ಲಿ ಆರ್ಡರ್ ಮಾಡಬಹುದು ಮತ್ತು ನೀವು ಪ್ರಚಾರದ ಕೋಡ್ ಅನ್ನು ಅನ್ವಯಿಸಿದರೆ 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 "echo" ಅನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ /* UDP ಸೇವೆಯ ಹೆಸರು */

#BUF_SIZE 500 /* ಡೇಟಾಗ್ರಾಮ್‌ಗಳ ಗರಿಷ್ಠ ಗಾತ್ರವನ್ನು ವ್ಯಾಖ್ಯಾನಿಸಿ
ಕ್ಲೈಂಟ್ ಮತ್ತು ಸರ್ವರ್ ಮೂಲಕ ಓದಬಹುದು */
_________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

ಪಟ್ಟಿ 56.2 ಸರ್ವರ್ ಅನುಷ್ಠಾನವನ್ನು ತೋರಿಸುತ್ತದೆ. ಕೆಳಗಿನ ಅಂಶಗಳನ್ನು ಗಮನಿಸುವುದು ಯೋಗ್ಯವಾಗಿದೆ:

  • ಸರ್ವರ್ ಅನ್ನು ಡೀಮನ್ ಮೋಡ್‌ಗೆ ಹಾಕಲು, ನಾವು ವಿಭಾಗ 37.2 ರಿಂದ beDaemon() ಕಾರ್ಯವನ್ನು ಬಳಸುತ್ತೇವೆ;

  • ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಹೆಚ್ಚು ಕಾಂಪ್ಯಾಕ್ಟ್ ಮಾಡಲು, ನಾವು ಇಂಟರ್ನೆಟ್ ಡೊಮೇನ್ ಸಾಕೆಟ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಲೈಬ್ರರಿಯನ್ನು ಬಳಸುತ್ತೇವೆ, ವಿಭಾಗ 55.12 ರಲ್ಲಿ ಅಭಿವೃದ್ಧಿಪಡಿಸಲಾಗಿದೆ;

  • ಸರ್ವರ್ ಕ್ಲೈಂಟ್‌ಗೆ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಹಿಂತಿರುಗಿಸಲು ಸಾಧ್ಯವಾಗದಿದ್ದರೆ, ಅದು syslog() ಕರೆಯನ್ನು ಬಳಸಿಕೊಂಡು ಲಾಗ್‌ಗೆ ಸಂದೇಶವನ್ನು ಬರೆಯುತ್ತದೆ.

ನೈಜ ಅಪ್ಲಿಕೇಶನ್‌ನಲ್ಲಿ, syslog() ಅನ್ನು ಬಳಸಿಕೊಂಡು ಸಂದೇಶಗಳನ್ನು ಲಾಗಿಂಗ್ ಮಾಡುವ ಆವರ್ತನದ ಮೇಲೆ ನಾವು ಕೆಲವು ಮಿತಿಯನ್ನು ವಿಧಿಸಬಹುದು. ಇದು ಆಕ್ರಮಣಕಾರರು ಸಿಸ್ಟಮ್ ಲಾಗ್ ಅನ್ನು ತುಂಬುವ ಸಾಧ್ಯತೆಯನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ. ಹೆಚ್ಚುವರಿಯಾಗಿ, syslog() ಗೆ ಪ್ರತಿ ಕರೆಯು ಸಾಕಷ್ಟು ದುಬಾರಿಯಾಗಿದೆ ಎಂಬುದನ್ನು ಮರೆಯಬೇಡಿ, ಏಕೆಂದರೆ ಇದು ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ fsync() ಅನ್ನು ಬಳಸುತ್ತದೆ.

ಪಟ್ಟಿ 56.2. UDP ಪ್ರತಿಧ್ವನಿ ಸೇವೆಯನ್ನು ಅಳವಡಿಸುವ ಪುನರಾವರ್ತನೆ ಸರ್ವರ್

___________________________________________________________________________________ ಸಾಕೆಟ್‌ಗಳು/id_echo_sv.c
#ಸೇರಿಸು
#"id_echo.h" ಸೇರಿಸಿ
#ಸೇರಿಸು "ಆಗಿದೆ_daemon.h"

ಇಂಟ್
ಮುಖ್ಯ (ಇಂಟ್ ಆರ್ಜಿಸಿ, ಚಾರ್ *ಆರ್ಜಿವಿ[])
{
ಇಂಟ್ ಎಸ್ಎಫ್ಡಿ;
ssize_t numRead;
ಸಾಕ್ಲೆನ್_ಟಿ ಲೆನ್;
ಸ್ಟ್ರಕ್ಟ್ sockaddr_storage claddr;
ಚಾರ್ ಬಫ್[BUF_SIZE];
ಚಾರ್ addrStr[IS_ADDR_STR_LEN];

ಒಂದು ವೇಳೆ (ಆಗಿದೆ ಡೇಮನ್(0) == -1)
ಎರ್ರೆಕ್ಸಿಟ್ ("ಆಗಿದೆ ಡೇಮನ್");

sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
ಒಂದು ವೇಳೆ (sfd == -1) {
syslog(LOG_ERR, "ಸರ್ವರ್ ಸಾಕೆಟ್ (%s) ರಚಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ",
strerror (errno));
ನಿರ್ಗಮಿಸಿ (EXIT_FAILURE);

/* ಡೇಟಾಗ್ರಾಮ್‌ಗಳನ್ನು ಸ್ವೀಕರಿಸಿ ಮತ್ತು ಕಳುಹಿಸುವವರಿಗೆ ಅವುಗಳ ಪ್ರತಿಗಳನ್ನು ಹಿಂತಿರುಗಿಸಿ */
}
ಫಾರ್ (;;) {
ಲೆನ್ = 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),
strerror (errno));
}
}
___________________________________________________________________________________ ಸಾಕೆಟ್‌ಗಳು/id_echo_sv.c

ಸರ್ವರ್ ಕಾರ್ಯಾಚರಣೆಯನ್ನು ಪರೀಕ್ಷಿಸಲು, ನಾವು ಪಟ್ಟಿ 56.3 ರಿಂದ ಪ್ರೋಗ್ರಾಂ ಅನ್ನು ಬಳಸುತ್ತೇವೆ. ವಿಭಾಗ 55.12 ರಲ್ಲಿ ಅಭಿವೃದ್ಧಿಪಡಿಸಲಾದ ಇಂಟರ್ನೆಟ್ ಡೊಮೇನ್ ಸಾಕೆಟ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಇದು ಲೈಬ್ರರಿಯನ್ನು ಸಹ ಬಳಸುತ್ತದೆ. ಮೊದಲ ಆಜ್ಞಾ ಸಾಲಿನ ಆರ್ಗ್ಯುಮೆಂಟ್ ಆಗಿ, ಕ್ಲೈಂಟ್ ಪ್ರೋಗ್ರಾಂ ಸರ್ವರ್ ಇರುವ ನೆಟ್ವರ್ಕ್ ನೋಡ್ನ ಹೆಸರನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಕ್ಲೈಂಟ್ ಒಂದು ಲೂಪ್ ಅನ್ನು ಪ್ರವೇಶಿಸುತ್ತದೆ, ಅಲ್ಲಿ ಅದು ಉಳಿದಿರುವ ಪ್ರತಿಯೊಂದು ಆರ್ಗ್ಯುಮೆಂಟ್‌ಗಳನ್ನು ಸರ್ವರ್‌ಗೆ ಪ್ರತ್ಯೇಕ ಡೇಟಾಗ್ರಾಮ್‌ಗಳಾಗಿ ಕಳುಹಿಸುತ್ತದೆ ಮತ್ತು ನಂತರ ಪ್ರತಿಕ್ರಿಯೆಯಾಗಿ ಸರ್ವರ್‌ನಿಂದ ಸ್ವೀಕರಿಸುವ ಡೇಟಾಗ್ರಾಮ್‌ಗಳನ್ನು ಓದುತ್ತದೆ ಮತ್ತು ಮುದ್ರಿಸುತ್ತದೆ.

ಪಟ್ಟಿ 56.3. UDP ಪ್ರತಿಧ್ವನಿ ಸೇವೆಗಾಗಿ ಗ್ರಾಹಕ

#"id_echo.h" ಸೇರಿಸಿ

ಇಂಟ್
ಮುಖ್ಯ (ಇಂಟ್ ಆರ್ಜಿಸಿ, ಚಾರ್ *ಆರ್ಜಿವಿ[])
{
ಇಂಟ್ ಎಸ್ಎಫ್ಡಿ, ಜೆ;
ಗಾತ್ರ_ಟಿ ಲೆನ್;
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)
ಎರ್ರೆಕ್ಸಿಟ್ ("ಓದಿ");
printf("[%ld ಬೈಟ್‌ಗಳು] %.*sn", (ಉದ್ದ) numRead, (int) numRead, buf);
}
ನಿರ್ಗಮಿಸಿ (EXIT_SUCCESS);
}
___________________________________________________________________________________ ಸಾಕೆಟ್‌ಗಳು/id_echo_cl.c

ಸರ್ವರ್ ಮತ್ತು ಎರಡು ಕ್ಲೈಂಟ್ ನಿದರ್ಶನಗಳನ್ನು ಚಾಲನೆ ಮಾಡುವಾಗ ನಾವು ನೋಡುವ ಉದಾಹರಣೆಯನ್ನು ಕೆಳಗೆ ನೀಡಲಾಗಿದೆ:

$su // ಕಾಯ್ದಿರಿಸಿದ ಪೋರ್ಟ್‌ಗೆ ಬಂಧಿಸಲು ಸವಲತ್ತುಗಳ ಅಗತ್ಯವಿದೆ
ಪಾಸ್ವರ್ಡ್:
# ./id_echo_sv // ಸರ್ವರ್ ಹಿನ್ನೆಲೆ ಮೋಡ್‌ಗೆ ಹೋಗುತ್ತದೆ
# ನಿರ್ಗಮನ // ನಿರ್ವಾಹಕರ ಹಕ್ಕುಗಳನ್ನು ಬಿಟ್ಟುಬಿಡಿ
$ ./id_echo_cl ಲೋಕಲ್ ಹೋಸ್ಟ್ ಹಲೋ ವರ್ಲ್ಡ್ // ಈ ಕ್ಲೈಂಟ್ ಎರಡು ಡೇಟಾಗ್ರಾಮ್‌ಗಳನ್ನು ಕಳುಹಿಸುತ್ತದೆ
[5 ಬೈಟ್‌ಗಳು] ಹಲೋ // ಕ್ಲೈಂಟ್ ಸರ್ವರ್‌ನಿಂದ ಸ್ವೀಕರಿಸಿದ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತದೆ
[5 ಬೈಟ್‌ಗಳು] ಪ್ರಪಂಚ
$ ./id_echo_cl ಲೋಕಲ್ ಹೋಸ್ಟ್ ವಿದಾಯ // ಈ ಕ್ಲೈಂಟ್ ಒಂದು ಡೇಟಾಗ್ರಾಮ್ ಅನ್ನು ಕಳುಹಿಸುತ್ತದೆ
[7 ಬೈಟ್‌ಗಳು] ವಿದಾಯ

ನಾನು ನಿಮಗೆ ಆಹ್ಲಾದಕರ ಓದುವಿಕೆಯನ್ನು ಬಯಸುತ್ತೇನೆ)

ಮೂಲ: linux.org.ru