α’αα»ααα½ααααΈ αααα»αααααΎαααααα αΆααααααΆαααα α·ααααα»αααΆααααααα’αααααΌαααααα βLinux API. ααααα»αααααααααααΌααααΌααΆαβ (ααΆαααααααααααα α ααα»α αααααΆαααααααα·ααΈααΈαα»α ) ααΆα’αΆα ααααΌαααΆααααααΆαα·ααα ααΎααα αααααααααα’αααααααα»αααααααΆα α αΎαααααα·αααΎα’αααα’αα»αααααααααΌαααααααααααΆα LinuxAPI α’αααααΉαααα½αααΆαααΆααααα α»αααααα 30% α
αααααααα ααααΈααααα ααΆα―αααΆααααα
ααααα ααααΆαααααααααααΆαααΈααα
αα αααα»αααααΌαααα ααΎαααΉααα·ααΆααααΆα’αααΈααΌαααααΆαααααΉαααααΆααα ααΆαααΆαααΈαααααααα αα·ααααΆαααΆα‘αα α αΎααααα·αα·αααααΎααααα·ααα·ααααα½αα α ααΆ inetd αααααααΎα±ααααΆααΆααααααΆααααα½ααααα»αααΆααααααΎααααααα·ααΈαααΆαααΈαααα’ααΈαααΊαα·αα
αααΆαααΈαααααααα αα·ααααΆαααΆα‘αα
ααΆαααααΆαααααααααααΆαααΈααααααααΆααααααΆαααΌαααααΆαααΎααααααααααΆααΈαα
-
αααααα αααΆαααΈααααααααΎα’αα·αα·αααααααα½αα ααααΎαααΆαααααΎααα½α (α¬ααααΎααΆα αααΎα) ααΈα’αα·αα·αααα½αα αΎααααααΆαααααααααα αααααΆααα
-
αααΆαααΆα‘ααα αααΆαααΈαααααααΌαααΆααα ααΆα‘αΎαααΎααααΈαααααΎα’αα·αα·ααα αααΎααααα»ααααααααΆαααααΆα
α§ααΆα ααααααααΆαααΈααααααααΆαααΌαααααΆαααΎαα½α FIFO ααααΌαααΆααααα αΆααα½α α αΎααα αααα»ααααααααΈ 44.8 α
ααΆααααααΆαααΆαααΈααααααααααΊαααααααααααα»αααααΆαααΆααααααααΎααααα’αα·αα·ααα’αΆα ααααΎαααΆαααΆαααΏαααααα»αααα·ααα α αΆααααΆααααΈα’αα·αα·ααααΈαα½ααααααΌαααΆααααααα±αααααα αΆααα αΌααααα’αα·αα·αααααααααααα ααΈαα»αααΆααααΌαααΆααααααΎα ααααΈααααΎααααΆααααΌαα αααααΆαααα·ααΈααΆααααααααααΊααΆαααααΆααααααΌαααααΎ αα·αααΆαααααΎααααααα½ααααΆααααΆαααΈαααααα αα·ααααΆαααΈαααα
αααΆαααΈααααααΆαααΆα‘ααααΊαααααααααα»αααααΈαααααααΎααΈαα½ααααααΌαααΆααααααααΆα αααΎαααΎααααΈααααΎαααΆα α¬ααααααααααααΆαααΈαααααα αα·ααααΆαααΈαααα αΌααα½ααααα»αααΆαααααΆααααααΌαααΆααααααα αα αααα»αααααΌαααα ααΎαααΉααααααααΆα ααααααΎαα·ααΈαααααααΈ (αα·αααΆαααααααα»α) ααααΆααα ααΆαααΆαααΈααααααΆαααΆα‘αα αααααΆααΆααααααΎαααααΎαααΆαααΌαααΆα ααααα‘αααααααΆααα’αα·αα·ααααααΈααΈαα½ααα ααααΎαααΆααααα’αα»ααααααΆαααΆαααΆααα’ααααΎααααΈαααααΎα’αα·αα·ααα αΎααααααΆαααααααα ααα αααααΆαααααααΎαααΆαααΆαααααααΈαα½ααααααΎαααΆααααα―αααΆααα α’αα·αα·ααααΆα αααΎαα’αΆα ααααΌαααΆααααααΎαααα»ααααααααΆαααααΆα ααΆααα·α αα α ααααααααααΎαααΆααα (αα) ααΊαααααΎαααΌαααΆα ααααα‘αααα½ααααααΆααα’αα·αα·ααααααΈααΈαα½αα (ααΆαααααΎα αααααααααΆαααααΆαααααα·ααααα·α’αΆα ααααΌαααΆααααααΎααααα½αα±ααααααΎαααΆα)α
αα αααα»ααααααααΆαααααα ααΎαααΉααα·αα·αααααΎαα§ααΆα ααααααααΆαααΈαααααααα’ααΈαααΊααααααααΆαααααααααααα αα·αααααααααΆα αααΆαααΈαααααΆααααΈααααα’αα»ααααααααααΆααααααααααΆα’αααΌ (RFC 862) ααααααα‘ααα αααΆααα ααααααααΆααααααΆαααααΎαα ααΆααααααΆαααΈααααααα
αααΆαααΈααα UDP αααααααααα
αα αααα»αααα αα·αααααααααααΆαα ααΎαααΉαααααΆα servers αααααΆααααααΆα’αααΌα ααΆααΆααα ααΎα αααααα 7 α αΎαααααΎαααΆαααΎααΆαα UDP αα·α TCP (α ααααααααααΌαααΆαααααα»ααα»α ααΌα ααααα αΎααααΆαααΈαααα’αααΌααααΌαααααααΎαααΆααααααΆααα·αααα·ααΆα’αααααααααααα)α
αααΆαααΈααα UDP α’αααΌααααα’αΆα datagrams αα·ααααααΌαα αααΆααα αααααα½αααΆαα α’αααααααΎα αααααΆααααΆαααΈαααααααΌαααΆαααααΎαααΆαααΆααααα½ααααα»αααααααα½α ααααΆαααααααααααααααΉααααααααααΆααα α―αααΆαααααααΆαααααΆαααααΆαααΈαααααααΌαααΆααααα αΆααα αααα»ααααααΈ 56.1 α
ααΆαα α»ααααααΈ α‘. α―αααΆαααααααΆαααααΆαααααααα·ααΈ id_echo_sv.c αα·α id_echo_cl.c
#include "inet_sockets.h" /* αααααΆααα»αααΆαααααααααααααΎα */
# αα½ααααα
αΌα "tlpi_hdr.h"
#αααααααααΆαααα "α’αααΌ" /* αααααααααΆαααα UDP */
#define BUF_SIZE 500 /* ααα αα’αα·ααααΆαα datagrams αααα
α’αΆα
ααααΌαααΆαα’αΆαααααααΆαααΈαααααα αα·ααααΆαααΈααα */
_________________________________________________________________________________ sockets/id_echo.h
ααΆαα α»ααααααΈ 56.2 αααα αΆαααΈααΆαα’αα»αααααααΆαααΈαααα α ααα»α ααΆαααααααα½αααααααααΆααα
-
ααΎααααΈααΆαα server α αΌααα αααα»ααααααααα·α ααΎαααααΎαα»αααΆα becomeDaemon() ααΈααααα 37.2;
-
ααΎααααΈααααΎα±αααααααα·ααΈααΆααααααααα½α ααΎαααααΎαααααΆααααααααΆααααααΎααΆαααΆαα½αααααα’αα·αααΊαα·α αααααααΌαααΆααααααΎαα‘αΎααα αααα»αααααα 55.12;
-
ααααα·αααΎαααΆαααΈααααα·αα’αΆα αααα‘ααααΆαααααΎααααα αααΆαααΈαααααααα ααΆαααααααΆααα ααΆαααααααα ααα»αααααααΎααΆαα α syslog() α
αα αααα»ααααααα·ααΈαα·αααααΆαααα½α ααΎαααααααΆααΉαααΆααααααα·ααα½αα ααα½αααΎααΆαααΉαααΆααααααΆααααααααΆααΆααααααααΎ syslog()α ααΆβααΉαβαα»αβα ααβααααααΆαβαααβα’αααβααΆααααα αΆαβα ααβααΎβαααααα ααα»βααααααααα ααΎαααΈααα αα»αααααα ααΆααΆααααΆαα α αα ααΆαα syslog() ααΊααΆααααααααααααΆαα αααααααΆααααΎ fsync() ααΆαααααΆαααΎαα
ααΆαα α»ααααααΈ α‘. αααΆαααΈαααααααΎα‘αΎααα·ααααα’αα»ααααααααΆααααα’αααΌ UDP
__________________________________________________________________sockets/id_echo_sv.c
#include
# αα½ααααα
αΌα "id_echo.h"
#αα½ααααα
αΌα "become_daemon.h"
int
αα (int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t len;
αα
ααΆαααααααα sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];
ααααα·αααΎ (ααααΆαααΆDaemon(0) == -1)
errExit("becomeDaemon");
sfd = inetBind(ααααΆαααα, SOCK_DGRAM, NULL);
ααααα·αααΎ (sfd == -1) {
syslog(LOG_ERR, "αα·αα’αΆα
αααααΎααααααααΆαααΈααα (%s)",
strerror (errno));
α
αα(EXIT_FAILURE);
/* ααα½α datagrams α αΎααααααΌαα
αααΆααα
ααααααααααΆαα
α’αααααααΎαα·α*/
}
αααααΆαα (;;) {
len = sizeof(struct sockaddr_storage);
numRead = recvfrom(sfd, buf, BUF_SIZE, 0, (struct sockaddr *) &claddr, &len);
ααααα·αααΎ (numRead == -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));
}
}
__________________________________________________________________sockets/id_echo_sv.c
ααΎααααΈααΆαααααααααα·ααααα·ααΆααααααααΆαααΈααα ααΎαααααΎαααααα·ααΈααΈ Listing 56.3α ααΆααααααΎαααααΆααααααααΆααααααΎααΆαααΆαα½αααααα’ααΈαααΊααα αααααααΌαααΆααααααΎαα‘αΎααα αααα»αααααα 55.12α ααΆα’αΆαα»ααααααααααΆααααΆααααααααΆααααΌα αααααα·ααΈα’αα·αα·αααααααααααααΆαααααααΆαααααααΆαααΈααααααα·ααα α αααΆαααΈααααααα αΌααααα»αααααα·ααα»ααααααΆααααΎα’αΆαα»αααααααΈαα½ααααααα ααααα αααΆαααΈαααααΆ datagrams ααΆα ααααα‘αα α αΎααααααΆααααα’αΆα αα·αααααα»ααα datagrams αααααΆααα½αααΆαααΈ server ααΆααΆαααααΎαααα
ααΆαα α»ααααααΈ α‘. α’αα·αα·αααααααΆααααααΆααααα’αααΌ UDP
# αα½ααααα αΌα "id_echo.h"
int
αα (int argc, char *argv[])
{
int sfd, j;
size_t len;
ssize_t numRead;
char buf[BUF_SIZE];
ααααα·αααΎ (argc < 2 || strcmp(argv[1], "--help") == 0)
useErr("%s host msgβ¦n", argv[0]);
/* αααααΎαα’αΆααααααΆααααΆαααΈααααααααα’ααααΎα’αΆαα»ααααααααααΆααααΆααααααααΆααααΌα */
sfd = inetConnect(argv[1], ααααΆαααα, SOCK_DGRAM);
ααααα·αααΎ (sfd == -1)
fatal("αα·αα’αΆα
ααααΆαααα
αααααααΆαααΈααα");
/* ααααΎα’αΆαα»αααααααααα
ααααα
αααΆαααΈααααααα»αααααααααΆ datagrams ααΆα
ααααα‘αα */
αααααΆαα (j = 2; j < argc; j ++) {
ααα = strlen(argv[j]);
ααααα·αααΎ (ααααα(sfd, argv[j], len) != len)
fatal("ααΆαααααααααααααα/αααΆααα");
numRead = α’αΆα(sfd, buf, BUF_SIZE);
ααααα·αααΎ (numRead == -1)
errExit("α’αΆα");
printf("[%ld bytes]%.*sn", (long) numRead, (int) numRead, buf);
}
α
αα(EXIT_SUCCESS);
}
__________________________________________________________________sockets/id_echo_cl.c
ααΆαααααααααααΆα§ααΆα αααααα’αααΈαααααΎαααΉαααΎααα αααααααΎαααΆααααΆαααΈααα αα·αα’αα·αα·ααααΈαα
$su // αα·αααα·ααααΌαααΆαααΆαααΆαααΎααααΈααααΆαααα
α
ααααααααΆαααααα»ααα»α
ααΆααααααααΆαα:
# ./id_echo_sv // αααΆαααΈαααα
αΌααα
αααα»αααααααααααΆαααααα
# α
αα // αααααααα·αααα·α’αααααααααααα
$ ./id_echo_cl localhost hello world // αααΆαααΈαααααααααααααΎ datagram ααΈα
[5 αα] ααααΆααα½α // αααΆαααΈαααααααααα αΆαααΆαααααΎααααααααα½αααΆαααΈαααΆαααΈααα
[5 αα] αα·ααααα
$ ./id_echo_cl localhost goodbye // αααΆαααΈαααααααααααααΎ datagram αα½αα
[7 αα] ααΆα αΎαα
αααα»αααΌαααΌαααα±ααα’αααα’αΆαααΈαααΆα)
ααααα: linux.org.ru