์ฑ… โ€œ๋ฆฌ๋ˆ…์Šค API. ์ข…ํ•ฉ์•ˆ๋‚ด'


์ฑ… โ€œ๋ฆฌ๋ˆ…์Šค API. ์ข…ํ•ฉ์•ˆ๋‚ด'

์ข‹์€ ์˜คํ›„์—์š” ์ €๋Š” "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