ืืืจ ืืฆืืจืืื ืืืืื ืื ื ืืฆืื ืืชืฉืืืช ืืืื ืืช ืืกืคืจ "Linux 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" /* ืืืจืื ืขื ืืคืื ืงืฆืืืช ืฉื ืืฉืงืข ืฉืื ื */
#include "tlpi_hdr.h"
#define SERVICE "echo" /* ืฉื ืฉืืจืืช UDP */
#define BUF_SIZE 500 /* ืืืื ืืงืกืืืื ืฉื ืืจื ื ืชืื ืื
ื ืืชื ืืงืจืื ืขื ืืื ืืงืื ืืฉืจืช */
__________________________________________________________________sockets/id_echo.h
ืจืืฉืื 56.2 ืืฆืื ืืช ืืืฉืื ืืฉืจืช. ืืืื ืืฉืื ืื ืื ืงืืืืช ืืืืืช:
-
ืืื ืืืื ืืก ืืช ืืฉืจืช ืืืฆื daemon, ืื ื ืืฉืชืืฉืื ืืคืื ืงืฆืื becomeDaemon() ืืกืขืืฃ 37.2;
-
ืืื ืืืคืื ืืช ืืชืืื ืืช ืืงืืืคืงืืืช ืืืชืจ, ืื ื ืืฉืชืืฉืื ืืกืคืจืืื ืืขืืืื ืขื ืฉืงืขื ืชืืื ืืื ืืจื ื, ืฉืคืืชืื ืืกืขืืฃ 55.12;
-
ืื ืืฉืจืช ืื ืืืื ืืืืืืจ ืชืืืื ืืืงืื, ืืื ืืืชื ืืืืขื ืืืื ืืืืฆืขืืช ืืงืจืืื () syslog.
ืืืืฉืื ืืืืชื, ืกืืืจ ืืื ืื ืฉื ืืื ืืืืื ืืกืืืืช ืขื ืชืืืจืืช ืจืืฉืื ืืืืขืืช ืืืืฆืขืืช syslog(). ืื ืืืื ืืช ืืืคืฉืจืืช ืฉื ืชืืงืฃ ืืืฆืืฃ ืืช ืืืื ืืืขืจืืช. ืื ืืกืฃ, ืื ืชืฉืื ืฉืื ืงืจืืื ื-syslog() ืืื ืื ืืงืจื, ืืืืืื ืฉืืื ืืฉืชืืฉืช ื-fsync() ืืืจืืจืช ืืืื.
ืจืฉืืืช 56.2. ืฉืจืช ืืืืจืฆืื ืฉืืืืฉื ืืช ืฉืืจืืช ืื UDP
_________________________________________________________________sockets/id_echo_sv.c
#ืึดืืืึนื
#include "id_echo.h"
#include "become_daemon.h"
int
main (int argc, char *argv [])
{
int sfd;
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
char buff[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];
if (becomeDaemon(0) == -1)
errExit("becomeDaemon");
sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
if (sfd == -1) {
syslog(LOG_ERR, "ืื ื ืืชื ืืืฆืืจ ืฉืงืข ืฉืจืช (%s)",
strerror(errno));
exit(EXIT_FAILURE);
/* ืงืืืช ืืืืืืช ื ืชืื ืื ืืืืืจืช ืขืืชืงืื ืฉืืื ืืฉืืืืื */
}
ื (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);
if (numRead == -1)
errExit("recvfrom");
if (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));
}
}
_________________________________________________________________sockets/id_echo_sv.c
ืืื ืืืืื ืืช ืคืขืืืช ืืฉืจืช, ืื ื ืืฉืชืืฉืื ืืชืืื ื ื- Listing 56.3. ืืื ืื ืืฉืชืืฉ ืืกืคืจืืื ืืขืืืื ืขื ืฉืงืขื ืชืืื ืืื ืืจื ื, ืฉืคืืชืื ืืกืขืืฃ 55.12. ืืืจืืืื ื ืฉืืจืช ืืคืงืืื ืืจืืฉืื, ืชืืื ืืช ืืืงืื ืืืงืืช ืืช ืืฉื ืฉื ืฆืืืช ืืจืฉืช ืขืืื ื ืืฆื ืืฉืจืช. ืืืงืื ื ืื ืก ืืืืืื ืฉืื ืืื ืฉืืื ืื ืืื ืืืืจืืืื ืืื ืื ืืชืจืื ืืฉืจืช ืืืจืืืช ื ืชืื ืื ื ืคืจืืืช, ืืืืืจ ืืื ืงืืจื ืืืืคืืก ืืช ืืจืืืช ืื ืชืื ืื ืฉืืื ืืงืื ืืืฉืจืช ืืชืืืื.
ืจืฉืืืช 56.3. ืืงืื ืืฉืืจืืช ืื UDP
#include "id_echo.h"
int
main (int argc, char *argv [])
{
int sfd, j;
size_t len;
ssize_t numRead;
char buff[BUF_SIZE];
if (argc < 2 || strcmp(argv[1], "--help") == 0)
usageErr("%s host msg...n", argv[0]);
/* ืฆืืจ ืืช ืืชืืืช ืืฉืจืช ืืืชืืกืก ืขื ืืืจืืืื ื ืืจืืฉืื ืฉื ืฉืืจืช ืืคืงืืื */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
if (sfd == -1)
fatal("ืื ื ืืชื ืืืชืืืจ ืืฉืงืข ืืฉืจืช");
/* ืฉืื ืืช ืืืจืืืื ืืื ืื ืืชืจืื ืืฉืจืช ืืฆืืจื ืฉื ืืืืืจืืืช ื ืคืจืืืช */
ืขืืืจ (j = 2; j < argc; j++) {
len = strlen(argv[j]);
if (ืืชืื(sfd, argv[j], len) != len)
fatal("ืืชืืื ืืืงืืช/ื ืืฉืื");
numRead = read(sfd, buf, BUF_SIZE);
if (numRead == -1)
errExit("read");
printf("[%ld bytes] %.*sn", (long) numRead, (int) numRead, buf);
}
exit(EXIT_SUCCESS);
}
_________________________________________________________________sockets/id_echo_cl.c
ืืืื ืืืืื ืืื ืฉื ืจืื ืืขืช ืืคืขืืช ืืฉืจืช ืืฉื ื ืืืคืขื ืืงืื:
$su // ืืจืฉืืืช ื ืืจืฉืืช ืืื ืืืืงืฉืจ ืื ืื ืฉืืืจ
ืกืืกืื:
# ./id_echo_sv // ืืฉืจืช ืขืืืจ ืืืฆื ืจืงืข
# exit // ืืืืชืจ ืขื ืืืืืืช ืืื ืื
$ ./id_echo_cl localhost hello world // ืืงืื ืื ืฉืืื ืฉื ื ื ืชืื ืื ืืจืืื
[5 bytes] hello // ืืืงืื ืืฆืื ืืช ืืชืืืื ืฉืืชืงืืื ืืืฉืจืช
[5 ืืชืื] ืขืืื
$ ./id_echo_cl localhost ืืืชืจืืืช // ืืงืื ืื ืฉืืื ืืืืืืจื ืืื
[7 ืืชืื] ืืืชืจืืืช
ืื ื ืืืื ืื ืงืจืืื ืืื ื)
ืืงืืจ: linux.org.ru