๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[๋ฆฌ๋ ์ค ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ] TCP์๋ฒ์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋ฐ ๋ณธ๋ฌธ
[๋ฆฌ๋ ์ค ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ] TCP์๋ฒ์ ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋๋ฐ
์ง์ง์ํ์นด 2024. 1. 31. 12:37<์์์ง ๋์ ์ฌ๋ฌผ์ธํฐ๋ท์ ์ํ ๋ฆฌ๋ ์ค ํ๋ก๊ทธ๋๋ฐ with ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด ์์ ์ ์ฐธ๊ณ ํด์ ์์ฑํ์์ต๋๋ค :-)>
โญ TCP
TCP ๋ ์ฐ๊ฒฐ ๊ธฐ๋ฐ์ ์ ๋ขฐ์ฑ์ด ์๋ ํต์ ๋ฐฉ์์ผ๋ก FTP, ๋ฉ์ผ, ์น ์๋น์ค ๋ฑ ์ธํฐ๋ท์ ์ด์ฉํ ๋ค์ํ ์๋น์ค์์ ์ฌ์ฉ๋๊ณ ์๋ค
TCP ๋ ์ฃผ๋ก ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ํต์ ๋ฐฉ์์ด๋ค

TCP ์๋ฒ๋ ์์ผ์ ์์ฑํ ํ ๋ฐ์ธ๋ (bind) ํ๋ ๊ณผ์ ์ UDP ๊ณผ์ ๊ณผ ๋์ผํ๋ค
but๐จ UDP์ ๋ค๋ฅด๊ฒ TCP ๋ ํด๋ผ์ด์ธํธ๊ฐ 3 Way-Handshaking (connect() ํจ์) ๋ฅผ ํตํด์ ์๋ฒ์ ์ ์ํ๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ์ ๋๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํ (queue) ๊ฐ ํ์ํ๋ค
์ด๋ฅผ ์ํด listen() ํจ์๋ฅผ ํตํด ๋๊ธฐ ํ๋ฅผ ์ค์ ํ๊ณ , accept() ํจ์๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์ ์ ์์ ๊ธฐ๋ค๋ฆด ์ ์๋ค
TCP ํด๋ผ์ด์ธํธ๋ ๋จผ์ ์์ผ์ ์์ฑํ๊ณ ์๋ฒ์ ์ ์์ ํด์ผํ๋๋ฐ, connect() ํจ์๋ฅผ ์ด์ฉํ๋ค
์๋ฒ์ ์ ์๋ ํ์๋ read() ๋ write() ํจ์๋ฅผ ํตํด ํต์ ์ ์งํํด๋ ๋๊ณ , recv()๋ send() ํจ์๋ฅผ ์ฌ์ฉํด๋ ๋๋ค
UDP ์ ๋ฌ๋ฆฌ, ์ด๋ฏธ ์๋ฒ์ ์ ์ํด ์์ผ๋ฏ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์๋ฒ์ ์ ๋ณด๋ฅผ ์ฌ์ฉํ ํ์๊ฐ ์๋ค
TCP๋ UDP ์ ๊ฐ์ด ๊ด๋ จ ํต์ ์์ ์ด ์๋ฃ๋๋ฉด close() ํจ์๋ฅผ ๋ถ๋ฌ์ ์์ผ์ ๋ซ์์ฃผ๋ฉด ๋๋ค
โญ TCP ํด๋ผ์ด์ธํธ
TCP ํด๋ผ์ด์ธํธ๋ ์์ผ์ ๋ง๋ ํ์ TCP ์๋ฒ์ ์ ์ํด์ผ ํ๋ค
connect() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์๋ฒ์ ์ ์ํ๊ณ , write()๋ send() ํจ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ฉฐ read()๋ recv() ํจ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋ค
์๋ฒ์์ ํต์ ์ด ๋๋๋ฉด close() ํจ์๋ฅผ ์ด์ฉํด์ ์ด์๋ ์์ผ์ ๋ซ๋๋ค
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
connect() ํจ์๋ ์๋ฒ์ ์์ผ์ ์ฐ๊ฒฐํ๋ฉฐ, ์๋ฒ์์ ์ฐ๊ฒฐ์ ์ฑ๊ณตํ๋ฉด 0์ ๋ฐํํ๊ณ , ์๋ฒ ์์ผ์ด ์กด์ฌํ์ง ์๊ฑฐ๋ ์์ผ ํ๊ฐ ๊ฐ๋ ์ฐจ ์์ผ๋ฉด -1์ ๋ฐํํ๋ค
์์ผ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ก ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ์ read(), write() ํจ์๋ฅผ ํตํด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ๋ณด๋ผ ์ ์์ผ๋ฉฐ, recv()๋ send() ํจ์๋ฅผ ์ด์ฉํด ํต์ ์ ์ํํ ์ ์๋ค
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
sszie_T send(int sockfd, const void * buf, size_T len, int flags);
โญ TCP ์๋ฒ
TCP ์๋ฒ๋ TCP ํด๋ผ์ด์ธํธ์์ ํต์ ์ ์ํด ์์ผ์ ์์ฑํ ํ, bind() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด์์ฒด์ (์ปค๋)์ ์๋น์ค๋ฅผ ์ฐ๊ฒฐํจ์ผ๋ก์จ ์๋ฒ๋ก ์ ์ํ๋ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋๋ก ์ค๋นํ๋ค
ํด๋ผ์ด์ธํธ ์๋น์ค์ ์ค๋น๊ฐ ์๋ฃ๋๋ฉด ์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ ์์ ์ฒ๋ฆฌํด์ผ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ํ์ํ๊ฒ ๋๋ค
์ด๋ listen() ํจ์๋ฅผ ์ด์ฉํด์ ์ฐ๊ฒฐ ์์ฒญ์ ์ํ ๋๊ธฐ ํ๋ฅผ ์ค์ ํ ์ ์๋ค
int listen(int sockfd, int backlog);
lisetn() ํจ์๋ ์ฐ๊ฒฐ ์์ฒญ์ ํ ์ ์๋ ์์ผ์ ์ต๋ ์๋ฅผ ๋ช ์ํ๋ฉฐ, ์ด ์๋ฅผ ๋์ด์๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ ์๋๋ ๊ฑฐ๋ถ๋๋ค
์๋ฒ์์ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋ํ ๊ณต๊ฐ (๋๊ธฐ ํ)๋ฅผ ํ๋ณดํ ํ์๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๋๊ธฐํด์ผ ํ๋๋ฐ, accept() ํจ์๋ฅผ ์ด์ฉํ ์ ์๋ค
accept() ํจ์๋ฅผ ํตํด์ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฐ๊ฒฐ๋๋ฉด ํด๋ผ์ด์ธํธ์ ํต์ ํ ์ ์๋ ์์ผ์ ๋ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ๋ฐํ๋๋ค
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags);
accept() ํจ์์๋ ์ ์ํ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด ์ฃผ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค
์ฃผ์ ๊ตฌ์กฐ์ฒด ํ๋ ์ค IP์ ํฌํธ๋ ๋น ์๋์์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ธ์ฝ๋ฉ ๋ณํ์ด ํ์ํ ์ ์๋ค
ํด๋ผ์ด์ธํธ์ ์ ์์ด ์ด๋ค์ง๋ฉด ํด๋ผ์ด์ธํธ์์ ํต์ ์ ์ํ ์๋ก์ด ํฌํธ ๋ฒํธ๊ฐ ๋ฐํ๋๋ฉฐ ์ด๋ฅผ ํตํด ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ํต์ ์ ์ฒ๋ฆฌํ ์ ์๋ค
// tcp_server.c
// TCP ์์ผ ๊ธฐ๋ฐ์ ํต์
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define TCP_PORT 5100 /* ์๋ฒ์ ํฌํธ ๋ฒํธ */
int main(int argc, char **argv)
{
int ssock; /* ์์ผ ๋์คํฌ๋ฆฝํธ ์ ์ */
socklen_t clen;
int n;
struct sockaddr_in servaddr, cliaddr; /* ์ฃผ์ ๊ตฌ์กฐ์ฒด ์ ์ */
char mesg[BUFSIZ];
/* ์๋ฒ ์์ผ ์์ฑ */
if((ssock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket()");
return -1;
}
/* ์ฃผ์ ๊ตฌ์กฐ์ฒด์ ์ฃผ์ ์ง์ */
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(TCP_PORT); /* ์ฌ์ฉํ ํฌํธ ์ง์ */
/* bind ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ ์์ผ์ ์ฃผ์ ์ค์ */
if(bind(ssock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("bind()");
return -1;
}
/* ๋์์ ์ ์ํ๋ ํด๋ผ์ด์ธํธ์ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋๊ธฐ ํ๋ฅผ ์ค์ */
if(listen(ssock, 8) < 0) {
perror("listen()");
return -1;
}
clen = sizeof(cliaddr);
do {
/* ํด๋ผ์ด์ธํธ๊ฐ ์ ์ํ๋ฉด ์ ์์ ํ์ฉํ๊ณ ํด๋ผ์ด์ธํธ ์์ผ ์์ฑ */
int n, csock = accept(ssock, (struct sockaddr *)&cliaddr, &clen);
/* ๋คํธ์ํฌ ์ฃผ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝ */
inet_ntop(AF_INET, &cliaddr.sin_addr, mesg, BUFSIZ);
printf("Client is connected : %s\n", mesg);
if((n = read(csock, mesg, BUFSIZ)) <= 0)
perror("read()");
printf("Received data : %s", mesg);
/* ํด๋ผ์ด์ธํธ๋ก buf์ ์๋ ๋ฌธ์์ด ์ ์ก */
if(write(csock, mesg, n) <= 0)
perror("write()");
close(csock); /* ํด๋ผ์ด์ธํธ ์์ผ์ ๋ซ์ */
} while(strncmp(mesg, "q", 1));
close(ssock); /* ์๋ฒ ์์ผ์ ๋ซ์ */
return 0;
}
/*
์๋ฒ๋ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๊ทธ๋๋ก ๋ณด๋ด์ฃผ๋ TCP ๊ธฐ๋ฐ์ ์์ฝ ์๋ฒ
socket() ํจ์์ SOCK_STREAM ์ต์
์ ์ฌ์ฉํ์ฌ TCP ์ฉ ์์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฐ๋ค
UDP์ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋น ํ๋ก๊ทธ๋จ์ ์๋ฒ๋ก ์ฌ์ฉํ๊ธฐ ์ํด์๋ bind() ํจ์๋ฅผ ์ด์ฉํ์ฌ ์ด์์ฒด์ ์ ์๋น์ค๋ฅผ ๋ฑ๋กํด์ผ ํ๊ณ ,
bind() ํจ์์ ๋ ๋ฒ์งธ ์ธ์๋ก ์๋ฒ ์์ ์ IP ์ฃผ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค
์ฝ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด INADDR_ANY ๋ฅผ ์ฌ์ฉํ์๋๋ฐ, ์๋ฒ์ IP ์ฃผ์๋ฅผ ์๋์ผ๋ก ์ฐพ์์ ์ฑ์์ค๋ค
ํด๋ผ์ด์ธํธ์ ํต์ ์ ์ํ ํฌํธ ๋ฒํธ๋ ์ค์ ํ์๋ค
ํด๋ผ์ด์ธํธ์ ์์ผ๋ค์ ์ํด ๋๊ธฐ ํ๋ฅผ ์ค์ ํด์ผ ํ๋ค. listen() ํจ์๋ฅผ ์ด์ฉํด์ ์ต๋ 8๋์ ํด๋ผ์ด์ธํธ๊ฐ ๋์ ์ ์ ๋๊ธฐ๋ฅผ ํ ์ ์๋๋ก ์ค์ ํ์๋ค
์์ผ ํ์ ์ค์ ์ด ๋๋๋ฉด ํด๋ผ์ด์ธํธ์ ์ ์์ ๊ธฐ๋ค๋ ค์ผ ํ๋๋ฐ, accept() ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค
์ ์ํ ํด๋ผ์ด์ธํธ์ ๋ํ ์ ๋ณด๋ ๋ ๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋๋ฉฐ, inet_ntop() ๋ฑ์ ํจ์๋ก ์ฌ๋์ด ์ฝ์ ์ ์๋ ๋ฌธ์ ๊ธฐ๋ฐ์ ์ฃผ์ ์คํธ๋ฆผ์ผ๋ก ๋ณํํด์ ์ถ๋ ฅํ ์ ์๋ค
์ค์ ํด๋ผ์ด์ธํธ์ ํต์ ์ accpet() ํจ์๋ก ๋ฐํ๋๋ ์์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ด์ฉํ๊ณ read() / recv() ์ write() / send() ๊ฐ์ ํจ์๋ฅผ ์ด์ฉํด์ ํต์ ์ ์งํํ ์ ์๋ค
ํต์ ์์
์ด ๋๋๋ฉด close() ํจ์๋ก ์ ์๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์์ผ์ ๊ฐ๊ฐ ๋ซ๋๋ค
*/
// tcp_client.c
// TCP ์์ผ ๊ธฐ๋ฐ์ ํต์
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#define TCP_PORT 5100
int main(int argc, char **argv)
{
int ssock;
struct sockaddr_in servaddr;
char mesg[BUFSIZ];
if(argc < 2) {
printf("Usage : %s IP_ADRESS\n", argv[0]);
return -1;
}
/* ์์ผ์ ์์ฑ */
if((ssock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket()");
return -1;
}
/* ์์ผ์ด ์ ์ํ ์ฃผ์ ์ง์ */
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
/* ๋ฌธ์์ด์ ๋คํธ์ํฌ ์ฃผ์๋ก ๋ณ๊ฒฝ */
inet_pton(AF_INET, argv[1], &(servaddr.sin_addr.s_addr));
servaddr.sin_port = htons(TCP_PORT);
/* ์ง์ ํ ์ฃผ์๋ก ์ ์ */
if(connect(ssock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
perror("connect()");
return -1;
}
fgets(mesg, BUFSIZ, stdin);
if(send(ssock, mesg, BUFSIZ, MSG_DONTWAIT) <= 0) { /* ๋ฐ์ดํฐ๋ฅผ ์์ผ์ ์ด๋ค. */
perror("send()");
return -1;
}
memset(mesg, 0, BUFSIZ);
if(recv(ssock, mesg, BUFSIZ, 0) <= 0) { /* ๋ฐ์ดํฐ๋ฅผ ์์ผ์ผ๋ก๋ถํฐ ์ฝ๋๋ค. */
perror("recv()");
return -1;
}
printf("Received data : %s", mesg); /* ๋ฐ์์จ ๋ฌธ์์ด์ ํ๋ฉด์ ์ถ๋ ฅ */
close(ssock); /* ์์ผ์ ๋ซ๋๋ค. */
return 0;
}
/*
ํด๋ผ์ด์ธํธ์์๋ TCP ์ฉ ์์ผ์ ์์ฑํ ํ connect() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฒ์ ์ ์ํ๋ค
connect() ํจ์์๋ ์๋ฒ ์ฃผ์์ ๋ํ ์ ๋ณด๋ฅผ ๋ช
์ํ๋ค
๊ธฐ๋ณธ์ ์ธ ์ฃผ์ ์ค์ ๋ฐฉ๋ฒ์ bind() ํจ์์ ๋์ผํ์ง๋ง, connect() ํจ์๋ INADDR_ANY ๋ฅผ ์ฌ์ฉํ ์ ์๋ค (ํฌํธ ๋ฒํธ๋ ์๋ฒ์ ๊ฐ์ ๋ฒํธ๋ฅผ ์ฌ์ฉ)
์๋ฒ์ ์ ์ํ ํ fgets() ํจ์๋ฅผ ์ด์ฉํด์ ํค๋ณด๋๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์๋ค์ธ ํ, ์์์ ์์ฑํ ์์ผ์ ์ด์ฉํ์ฌ send() ๋ write() ํจ์๋ฅผ ํตํด ์๋ฒ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๊ณ ,
resv() ๋ read() ํจ์๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋ค. printf() ํจ์๋ฅผ ์ด์ฉํด์ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ์๋ค
์์ ์ฝ๋๋ฅผ ๋น๋ํ๊ณ ๋จผ์ ์๋ฒ๋ฅผ ์คํ์ํจ๋ค. UDP ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํด๋ผ์ด์ธํธ๋ฅผ ํจ๊ป ์คํํ๋ ค๋ฉด ๋ค๋ฅธ ํฐ๋ฏธ๋์ด ํ์ํ๋ฏ๋ก ๋ค๋ฅธ ํฐ๋ฏธ๋์ ์ด๊ณ ๋ก๊ทธ์ธ OR ์๋ฒ๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ใ
ฃในํ
๊ฐ์ ๋ผ์ฆ๋ฒ ๋ฆฌํ์ด/PC ์์ ์คํ๋๊ณ ์๋ ์๋ฒ๋ก ์ ์ํ ๋๋ ์๋ฒ์ 127.0.0.1์ ์
๋ ฅํ๋ค
ํด๋ผ์ด์ธํธ์์ ๋ฌธ์์ด์ ์
๋ ฅํ๋ฉด TCP ๋ฅผ ํตํด์ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ํต์ ์ด ์ด๋ค์ง๋ค
ํด๋ผ์ด์ธํธ๋ ๋จผ์ ์๋ฒ๋ก ๋ฌธ์์ด์ ๋ณด๋ด๋ฉด ์๋ฒ์์๋ ๋ฌธ์์ด์ ์ฝ๊ณ ๋ค์ ํด๋ผ์ด์ธํธ์๊ฒ ๋๋๋ ค์ค๋ค
ํด๋ผ์ด์ธํธ๋ ์๋ฒ๋ก๋ถํฐ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ํ๋ฉด์ ์ถ๋ ฅํ๊ณ ์๋ฒ๋ฅผ ์ข
๋ฃํ๊ณ ์ถ์ ๋๋ ํด๋ผ์ด์ธํ๋ฅด ์์ํ๊ณ q ๋ฅผ ์
๋ ฅํ๋ฉด ๋๋ค
*/
gcc -o tcp_server tcp_server.c
gcc -o tcp_client tcp_client.c
./tcp_server &
./tcp_client 127.0.0.1

โญ ์ฐ์ํ ์ฐ๊ฒฐ ์ข ๋ฃ: shutdown() ํจ์
close() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฒ์์์ ์ฝ๊ธฐ / ์ถ๋ ฅ ์ฉ ์์ผ์ ๋ชจ๋ ๋ซ๋๋ค
shutdown() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ฝ๊ธฐ ์์ผ๋ง ๋ซ๊ฑฐ๋, ์ฐ๊ธฐ ์์ผ๋ง ๋ซ์ ์ ์๋ค
int shutdown(int sockfd, int how);
shutdown() ํจ์์ ๋ ๋ฒ์งธ ์ธ์(how) ๋ฅผ ํตํด ์ฝ๊ฑฐ๋ ์ฐ๊ธฐ ํน์ ์ฝ๊ธฐ/์ฐ๊ธฐ ์ฉ ์์ผ์ ๋ชจ๋ ๋ซ์ ์ ์๋ค
shutdown() ํจ์์ SHUT_RDWR ์ ์ด์ฉํ๋ฉด close() ํจ์์ฒ๋ผ ์ /์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ชจ๋ ๋ซ๋๋ฐ, close() ํจ์์ ๋ฌ๋ฆฌ ๋ณ๋ค๋ฅธ ์์ ์์ด ๋ฐ๋ก ์ข ๋ฃ์ํจ๋ค
์์ซ๊ฐ | ๋ชจ๋ | ๋ด์ฉ |
0 | SHUT_RD | ์ ๋ ฅ ์คํธ๋ฆผ ์ข ๋ฃ |
1 | SHUT_WR | ์ถ๋ ฅ ์คํธ๋ฆผ ์ข ๋ฃ |
2 | SHUT_RDWR | ์ /์ถ๋ ฅ ์คํธ๋ฆผ ์ข ๋ฃ |
ํด๋ผ์ด์ธํธ ์ฝ๋์์๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ธ ํ์ shutdown() ํจ์๋ฅผ ์ด์ฉํด ์์ผ์ ์ฐ๊ธฐ ์คํธ๋ฆผ์ ๋ซ๊ณ (SHUT_WR), ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ์๋ ์์ผ ์ฝ๊ธฐ ์คํธ๋ฆผ์ ๋ซ์ ์ ์๋ค (SHUT_RD)