์ข์ ์คํ์์ ์ ๋ "Linux API"๋ผ๋ ์ฑ ์ ์ฌ๋ฌ๋ถ์๊ฒ ์๊ฐํฉ๋๋ค. ํฌ๊ด์ ์ธ ๊ฐ์ด๋"(์ฑ ๋ฒ์ญ) Linux ํ๋ก๊ทธ๋๋ฐ ์ธํฐํ์ด์ค). ์ถํ์ฌ ํํ์ด์ง์์ ์ฃผ๋ฌธ ๊ฐ๋ฅํ๋ฉฐ, ํ๋ก๋ชจ์ ์ฝ๋๋ฅผ ์ ์ฉํ์๋ฉด ๋ฆฌ๋ ์คAPI , 30% ํ ์ธ์ ๋ฐ์ผ์ค ์ ์์ต๋๋ค.
์ฐธ๊ณ ์ฉ์ผ๋ก ์ฑ ์์ ๋ฐ์ท:
์์ผ: ์๋ฒ ์ํคํ ์ฒ
์ด ์ฅ์์๋ ๋ฐ๋ณต ๋ฐ ๋ณ๋ ฌ ์๋ฒ ์ค๊ณ์ ๊ธฐ๋ณธ ์ฌํญ์ ๋ํด ์ค๋ช ํ๊ณ ์ธํฐ๋ท ์๋ฒ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ ์ฝ๊ฒ ๋ง๋ค ์ ์๋ inetd๋ผ๋ ํน์ ๋ฐ๋ชฌ๋ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ณต ๋ฐ ๋ณ๋ ฌ ์๋ฒ
๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์์ผ ๊ธฐ๋ฐ ๋คํธ์ํฌ ์๋ฒ ์ํคํ ์ฒ๊ฐ ์์ต๋๋ค.
-
๋ฐ๋ณต์ : ์๋ฒ๋ ํ ๋ฒ์ ํ๋์ฉ ํด๋ผ์ด์ธํธ์๊ฒ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋จผ์ ํ ํด๋ผ์ด์ธํธ์ ์์ฒญ(๋๋ ์ฌ๋ฌ ์์ฒญ)์ ์ฒ๋ฆฌํ ํ ๋ค์ ํด๋ผ์ด์ธํธ๋ก ์ด๋ํฉ๋๋ค.
-
๋ณ๋ ฌ: ์๋ฒ๋ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ๋์์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
FIFO ๋๊ธฐ์ด์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ฐ๋ณต ์๋ฒ์ ์๋ ์ด๋ฏธ ์น์ 44.8์ ๋์ ์์ต๋๋ค.
๋ฐ๋ณต ์๋ฒ๋ ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ ์์ฒญ์ด ์๋นํ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ ์ ์๋ ์ํฉ์๋ง ์ ํฉํฉ๋๋ค. ์๋ํ๋ฉด ๊ฐ ํด๋ผ์ด์ธํธ๋ ์์ ์๋ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ๊ฐ ์๋น์ค๋ฅผ ๋ฐ์ ๋๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ๋จ์ผ ์์ฒญ๊ณผ ์๋ต์ ๊ตํํ๋ ๊ฒ์ ๋๋ค.
๋ณ๋ ฌ ์๋ฒ๋ ๊ฐ ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์๋นํ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฑฐ๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๊ธด ๋ฉ์์ง ๊ตํ์ ์ฐธ์ฌํ๋ ๊ฒฝ์ฐ์ ์ ํฉํฉ๋๋ค. ์ด ์ฅ์์๋ ๋ณ๋ ฌ ์๋ฒ๋ฅผ ์ค๊ณํ๋ ์ ํต์ ์ธ(๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๊ฐ๋จํ) ๋ฐฉ๋ฒ, ์ฆ ๊ฐ๊ฐ์ ์ ํด๋ผ์ด์ธํธ์ ๋ํด ๋ณ๋์ ํ์ ํ๋ก์ธ์ค๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ค์ ์ ๋ ๊ฒ์ ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ํด๋ผ์ด์ธํธ์ ์๋น์ค๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๋ชจ๋ ์์ ์ ์ํํ ํ ์ข ๋ฃ๋ฉ๋๋ค. ์ด๋ฌํ ๊ฐ ํ๋ก์ธ์ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ํ๋ฏ๋ก ์ฌ๋ฌ ํด๋ผ์ด์ธํธ์ ๋์์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ฃผ ์๋ฒ ํ๋ก์ธ์ค(์์)์ ์ฃผ์ ์์ ์ ๊ฐ๊ฐ์ ์ ํด๋ผ์ด์ธํธ์ ๋ํด ๋ณ๋์ ํ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค(๋๋ ํ๋ก์ธ์ค ๋์ ์คํ ์ค๋ ๋๋ฅผ ์์ฑํ ์๋ ์์).
๋ค์ ์น์ ์์๋ ๋ฐ๋ณต ๋ฐ ๋ณ๋ ฌ ์ธํฐ๋ท ๋๋ฉ์ธ ์์ผ ์๋ฒ์ ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ๋ ์๋ฒ๋ ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ๋ชจ๋ ๋ฉ์์ง์ ๋ณต์ฌ๋ณธ์ ๋ฐํํ๋ ๋จ์ํ๋ ๋ฒ์ ์ ์์ฝ ์๋น์ค(RFC 862)๋ฅผ ๊ตฌํํฉ๋๋ค.
๋ฐ๋ณต UDP ์๋ฒ ์์ฝ
์ด ์น์ ๊ณผ ๋ค์ ์น์ ์์๋ ์์ฝ ์๋น์ค์ฉ ์๋ฒ๋ฅผ ์๊ฐํฉ๋๋ค. ํฌํธ ๋ฒํธ 7์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ UDP์ TCP ๋ชจ๋์์ ์๋ํฉ๋๋ค(์ด ํฌํธ๋ ์์ฝ๋์ด ์์ผ๋ฏ๋ก ์์ฝ ์๋ฒ๋ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํ๋์ด์ผ ํฉ๋๋ค).
echo 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 /* ๋ฐ์ดํฐ๊ทธ๋จ์ ์ต๋ ํฌ๊ธฐ
ํด๋ผ์ด์ธํธ์ ์๋ฒ์์ ์ฝ์ ์ ์์ */
____________________________________________________________________________________์์ผ/id_echo.h
๋ชฉ๋ก 56.2๋ ์๋ฒ ๊ตฌํ์ ๋ณด์ฌ์ค๋๋ค. ๋ค์ ์ฌํญ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
-
์๋ฒ๋ฅผ ๋ฐ๋ชฌ ๋ชจ๋๋ก ์ ํํ๋ ค๋ฉด ์น์ 37.2์ makeDaemon() ํจ์๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
ํ๋ก๊ทธ๋จ์ ๋์ฑ ์ปดํฉํธํ๊ฒ ๋ง๋ค๊ธฐ ์ํด ์น์ 55.12์์ ๊ฐ๋ฐ๋ ์ธํฐ๋ท ๋๋ฉ์ธ ์์ผ ์์ ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐํํ ์ ์์ผ๋ฉด syslog() ํธ์ถ์ ์ฌ์ฉํ์ฌ ๋ก๊ทธ์ ๋ฉ์์ง๋ฅผ ์๋๋ค.
์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ syslog()๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ๋ก๊น ๋น๋์ ์ผ๋ถ ์ ํ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ณต๊ฒฉ์๊ฐ ์์คํ ๋ก๊ทธ๋ฅผ ์ค๋ฒํ๋กํ ๊ฐ๋ฅ์ฑ์ด ์ ๊ฑฐ๋ฉ๋๋ค. ๋ํ syslog()์ ๋ํ ๊ฐ ํธ์ถ์ ๊ธฐ๋ณธ์ ์ผ๋ก fsync()๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋น์ฉ์ด ๋ง์ด ๋ ๋ค๋ ์ ์ ์์ง ๋ง์ญ์์ค.
๋ชฉ๋ก 56.2. UDP ์์ฝ ์๋น์ค๋ฅผ ๊ตฌํํ๋ ๋ฐ๋ณต ์๋ฒ
_________________________________________________________________sockets/id_echo_sv.c
#ํฌํจํ๋ค
#include "id_echo.h"
#include "become_daemon.h"
INT
๋ฉ์ธ(int argc, char *argv[])
{
int sfd;
ssize_t numRead;
socklen_t len;
struct sockaddr_storage claddr;
char buf[BUF_SIZE];
char addrStr[IS_ADDR_STR_LEN];
if (becomeDaemon(0) == -1)
errExit("become๋ฐ๋ชฌ");
sfd = inetBind(SERVICE, SOCK_DGRAM, NULL);
if (sfd == -1) {
syslog(LOG_ERR, "์๋ฒ ์์ผ(%s)์ ์์ฑํ ์ ์์ต๋๋ค.",
strerror(errno));
์ข
๋ฃ(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)
!= ์ซ์์ฝ๊ธฐ)
syslog(LOG_WARNING, "%s(%s)์ ๋ํ ์๋ต์ ์์ฝํ๋ ์ค ์ค๋ฅ ๋ฐ์",
inetAddressStr((struct sockaddr *) &claddr, len,
addrStr, IS_ADDR_STR_LEN),
strerror(errno));
}
}
_________________________________________________________________sockets/id_echo_sv.c
์๋ฒ์ ์๋์ ํ ์คํธํ๊ธฐ ์ํด ๋ชฉ๋ก 56.3์ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํฉ๋๋ค. ๋ํ ์น์ 55.12์์ ๊ฐ๋ฐ๋ ์ธํฐ๋ท ๋๋ฉ์ธ ์์ผ ์์ ์ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ๋ช ๋ น์ค ์ธ์๋ก ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์๋ฒ๊ฐ ์์นํ ๋คํธ์ํฌ ๋ ธ๋์ ์ด๋ฆ์ ์ฌ์ฉํฉ๋๋ค. ํด๋ผ์ด์ธํธ๋ ๋๋จธ์ง ์ธ์ ๊ฐ๊ฐ์ ๋ณ๋์ ๋ฐ์ดํฐ๊ทธ๋จ์ผ๋ก ์๋ฒ์ ๋ณด๋ธ ๋ค์ ์๋ต์ผ๋ก ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๊ทธ๋จ์ ์ฝ๊ณ ์ธ์ํ๋ ๋ฃจํ์ ๋ค์ด๊ฐ๋๋ค.
๋ชฉ๋ก 56.3. UDP ์์ฝ ์๋น์ค์ฉ ํด๋ผ์ด์ธํธ
#include "id_echo.h"
INT
๋ฉ์ธ(int argc, char *argv[])
{
int sfd, j;
size_t len;
ssize_t numRead;
char buf[BUF_SIZE];
if (argc < 2 || strcmp(argv[1], "--help") == 0)
UsageErr("%s ํธ์คํธ ๋ฉ์์งโฆn", argv[0]);
/* ์ฒซ ๋ฒ์งธ ๋ช
๋ น์ค ์ธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ฒ ์ฃผ์ ๊ตฌ์ฑ */
sfd = inetConnect(argv[1], SERVICE, SOCK_DGRAM);
if (sfd == -1)
fatal("์๋ฒ ์์ผ์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.");
/* ๋๋จธ์ง ์ธ์๋ฅผ ๋ณ๋์ ๋ฐ์ดํฐ๊ทธ๋จ ํํ๋ก ์๋ฒ์ ๋ณด๋
๋๋ค */
for (j = 2; j < argc; j++) {
len = strlen(argv[j]);
if (write(sfd, argv[j], len) != len)
fatal("๋ถ๋ถ/์คํจํ ์ฐ๊ธฐ");
numRead = ์ฝ๊ธฐ(sfd, buf, BUF_SIZE);
if (numRead == -1)
errExit("์ฝ๊ธฐ");
printf("[%ld ๋ฐ์ดํธ] %.*sn", (long) numRead, (int) numRead, buf);
}
์ข
๋ฃ(EXIT_SUCCESS);
}
__________________________________________________________________sockets/id_echo_cl.c
๋ค์์ ์๋ฒ์ ๋ ๊ฐ์ ํด๋ผ์ด์ธํธ ์ธ์คํด์ค๋ฅผ ์คํํ ๋ ํ์๋๋ ๋ด์ฉ์ ์์ ๋๋ค.
$su // ์์ฝ๋ ํฌํธ์ ๋ฐ์ธ๋ฉํ๋ ค๋ฉด ๊ถํ์ด ํ์ํฉ๋๋ค.
์ํธ:
# ./id_echo_sv // ์๋ฒ๊ฐ ๋ฐฑ๊ทธ๋ผ์ด๋ ๋ชจ๋๋ก ์ ํ๋ฉ๋๋ค.
# ์ข
๋ฃ // ๊ด๋ฆฌ์ ๊ถํ ํฌ๊ธฐ
$ ./id_echo_cl localhost hello world // ์ด ํด๋ผ์ด์ธํธ๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ๊ทธ๋จ์ ๋ณด๋
๋๋ค.
[5 bytes] hello // ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต์ ํ์ํฉ๋๋ค.
[5๋ฐ์ดํธ] ์ธ๊ณ
$ ./id_echo_cl localhost ์๋
// ์ด ํด๋ผ์ด์ธํธ๋ ํ๋์ ๋ฐ์ดํฐ๊ทธ๋จ์ ๋ณด๋
๋๋ค.
[7๋ฐ์ดํธ] ์๋
์ฆ๊ฑฐ์ด ๋ ์๊ฐ ๋์ จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค)
์ถ์ฒ : linux.org.ru