Develop the Chat Application multithreaded
Raw CLI chatting application for C language socket API practice.
- Change directory to root
(Multi-Threaded_Chat-Application directory) - Just type
make
- Change directory to root
(Multi-Threaded_Chat-Application directory) - Just type
make clean
bin: executable binary.img: report images.include: header and backend function source file. (After build, then object file exist too.)src: main(frontend) source file. (After build, then object file exist too.)
๋ชจ๋ ์์ค์์ ์๋ฌ์ ๊ฐ๋ ฅํ๊ฒ ๋์ํ์ฌ assertion์ ๋ฐ์์ํจ๋ค.
client์ server์์ ์ฌ์ฉํ๋ ๋ชจ๋ ํค๋๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํ์๊ณ , ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ํจ์๋ค์ ๋ํ ์ ์ธ์ด ์กด์ฌํ๋ค.
๋ ๋ณ๋๋ก ์๋ฒ๋จ์์ ์์ฉํ ์ ์๋ client์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ ์ฅํ๋ macro์ pthread์ ์์ ๊ฒฝ์ ์ํ(race condition)์ทจ์ฝ์ ์ ๋ฐฉ์งํ๊ธฐ ์ํ pthread mutex๋ ์กด์ฌํ๋ค.
๋, ์๋ฃํ์ ๋ณด๊ธฐ ํธํ๊ฒ ์๋ก ์ ์ํ๋ค.
File stream clean up.
Get the input message string.
๋ฌดํ์ ์
๋ ฅ์ ๋ฐ๊ธฐ ์ํด, 1byte์ฉ ์
๋ ฅ์ ๋ฐ๋ค๊ฐ ์ผ์ ํฌ๊ธฐ ์ด์์ ์
๋ ฅ์ ๋ฐ๊ฒ๋์๋ค๋ฉด ๊ณต๊ฐ์ ์ฌํ ๋นํ๊ณ readํจ์๋ฅผ ํตํด ์
๋ ฅ์ ๊ณ์ ๋ฐ๋๋ค.
๊ฐํ์ด๋ NULL byte๊ฐ ์
๋ ฅ๋ ๋๊น์ง ๋ฐ๋ณตํ๊ณ , ๋ฌด์กฐ๊ฑด ๋ฌธ์์ด์ ๋ง์ง๋ง์ด '\n\0'์ด ๋๋๋ก ๊ตฌ์ฑํ๋ค.
readํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก int read(int fd, void *buf, size_t count);์ ํํ๋ก ๊ตฌ์ฑ์ด ๋์ด์๋ค.
1๋ฒ์งธ ์ธ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ(์ฌ๊ธฐ์๋ 0, stdin์ fd), 2๋ฒ์งธ ์ธ์์๋ ๋ฒํผ์ ์ฃผ์, 3๋ฒ์งธ ์ธ์์๋ ์
๋ ฅ๋ฐ์ ๊ธธ์ด๋ฅผ ๋๊ฒจ๋ฐ๋๋ค.
readํจ์๋ ๋๊ฒจ๋ฐ์ fd์ ํ์ผ๋ก๋ถํฐ count๋งํผ buf์ ์
๋ ฅ์ ๋ฐ๋ ํจ์๋ค. ํจ์๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ํ๋ฉด ์
๋ ฅ๋ฐ์ ๊ธธ์ด๋ฅผ, ์คํจํ๋ค๋ฉด error number๋ฅผ ๋ฐํํ๋ค.
sendMsg
send๋ผ๋ TCP/IP ํต์ API๋ฅผ ํตํด ์
๋ ฅ๋ฐ์ msg๋ฅผ ์ ์กํ๋ค.
sendํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ssize_t send(int sockfd, const void *buf, size_t len, int flags);์ ํํ๋ก ํจ์ ํ์์ด ๊ตฌํ๋์ด์๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์์ค๋ sockfd์ ์ฐ๊ฒฐ๋ ์์ผ์ buf๋ฅผ len๋งํผ tcp/ip protocol์ ํตํด ์ ์กํ๋ค. flag๊ฐ์ ์ก์ ๋ฐฉ์์ ์ค์ ํ๋ค.
recvMsg
recv๋ผ๋ TCP/IP ํต์ API๋ฅผ ํตํด msg๋ฅผ ์ ์ก๋ฐ๋๋ค.
recvํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ssize_t recv(int sockfd, void *buf, size_t len, int flags);์ ํํ๋ก ํจ์ ํ์์ด ๊ตฌํ๋์ด์๋ค.
์ฒซ ๋ฒ์งธ ์ธ์๋ก ๋ฐ์์ค๋ sockfd์ ์ฐ๊ฒฐ๋ ์์ผ์์ ์
๋ ฅ์ buf์ len๋งํผ tcp/ip protocol์ ํตํด ๋ฐ์์จ๋ค. flag๊ฐ์ ์์ ๋ฐฉ์์ ์ค์ ํ๋ค.
์ด ๊ณผ์ ์์ ๋ฐ๋ msg์ ํฌ๊ธฐ ์ ํ์ด ์๋๋ก readBuf์ ๋ฃจํด์ ์ฐธ์กฐํ๋ค.
์ดํ์๋ ๋ฐ์์จ msg๋ฅผ ๋ฐํํ๋ค.
DISCONNECT_STR๋ ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ด ์ข
๋ฃ๋์ ๋, ์ฐ๊ฒฐ ์ข
๋ฃ๋ฅผ ์๋ฆฌ๊ธฐ ์ํ string์ ์ฌ์ ์ ์ ์ํด๋์ macro๋ค.
๋, client์ sender๋ผ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์์ฑํ๋ค.
client๊ตฌ์กฐ์ฒด๋ ๊ฐ๊ฐ ์ฐ๊ฒฐ๋ 5๊ฐ์ ํด๋ผ์ด์ธํธ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์กด์ฌํ๊ณ , sender๊ตฌ์กฐ์ฒด๋ ๋ฐ์์จ ๋ฉ์์ง๋ฅผ ์ ์์ผ์ ๋ค ์ ์กํ๊ธฐ ์ํด ๋ฐ์์จ ๋ฉ์์ง์ ๋ํ ์ ๋ณด(sender fd, sender name, message value, used)๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
์๋ฒ ๋ฐ์ด๋๋ฆฌ ์ธ์์ ์ ํจ์ฑ์ ๊ฒ์ฆํ๋ ํจ์๋ค. ์ ํจ์ฑ ๊ฒ์ฆ์ ์คํจํ๋ฉด, 1์ ๋ฐํํ๋ค. ์์ธํ ์ค๋ช ์ ์๋ตํ๊ฒ ๋ค.
์์ ์ค๋ช
ํ validateArgv๋ฅผ ํตํด ์ธ์์ ์ ํจ์ฑ์ ๊ฒ์ฆํ ๋ค, strtoullํจ์๋ก port๊ฐ์ int๋ก ๋ณํํ์ฌ ๋ฐํํ๋ค.
sockaddr_in๊ตฌ์กฐ์ฒด ํฌ์ธํฐ๋ฅผ ์ธ์๋ก ๋๊ฒจ๋ฐ๊ณ , ํด๋น ์ธ์ ๊ฐ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ค.
inet_ntopํจ์๋ addr->sin_addr์ ์ ์ฅ๋ ip address์ ๊ฐ์ string์ผ๋ก ๋ณํํด์ค๋ค.
์ ์ฒด์ ์ธ ๋ฃจํด์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ง์ฝ ์ ์ญ๋ณ์ SOCKFD์ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด,
- socket ์์ฑ
- ์ง์ ๋ ์ ๋ณด๋ก addr ์ ๋ณด ํ ๋น
bindAPI๋ฅผ ํตํด์ addr๋ณ์ ๊ฐ์ ์์ฑ๋ socket์ ์ ์ฉlistenAPI๋ฅผ ํตํด์ socket์passive opening์ํ๋ก ๋ณ๊ฒฝ (์ธ๋ถ ์ฐ๊ฒฐ ํ์ฉ -> tcp 3-way handshake๊ณผ์ ์ (syn->syn, ack->ack) ๋ชจ๋ ์ฒ๋ฆฌํ๋ค.)- ์ ์ญ๋ณ์
SOCKFD์ ์์ฑ๋ socket fd ํ ๋น. accpetAPI๋ฅผ ํตํด, ์ฐ๊ฒฐ์ ์์ ๋ฐ์์ ๊ฒฝ์ฐ, ์ค์ ๋ก ์ฐ๊ฒฐ์ ์ฉ์ธ. (passive open ์ํ์์ ๊ฒฝ์ฐ์๋ ์ฐ๊ฒฐ ์๋ฆฝ ๋ฐ ๋ฉ์์ง ์์ ์ ํ์ ๊ฒฝ์ฐ queue์ ์ ์ฅํด๋์ง๋ง accept๋ ์ดํ์๋ queue์ ๋ด๊ธด ๊ฒ๋ค์ ๋ชจ๋ ๊บผ๋ด์์ communication์ ์งํํ๋ค.)- ์ต์ข ์ ์ผ๋ก ์ฐ๊ฒฐ์ด ์๋ฆฝ๋ client์ ๋ํ ์ ๋ณด ์ถ๋ ฅ
๋ง์ฝ SOCKFD๊ฐ ์ด๋ฏธ ๊ฐ์ด ํ ๋น๋์๋ค๋ฉด,
- ์์ ๋ชจ๋ ๊ณผ์ ์ ์๋ตํ๊ณ
accept๊ณผ์ ๋ง ์งํํ๋ค. (์ด์ฒํผ ์ด๋ฏธ socket์passive open์ํ์ผ ๊ฒ์ด๋ฏ๋ก)
ํธ๋ค๋ฌ ํจ์ ์ด์ ์ send ๋ฐ recv routineํจ์์ ๋ํ ์ ์ธ์ด ์กด์ฌํ๋ฉฐ, ์์ ์ค๋ช
ํ ๋ ๊ตฌ์กฐ์ฒด์ ์ ์ญ๋ณ์ ์ ์ธ์ด ์กด์ฌํ๋ค. CLIENTS๋ฐฐ์ด์ CLIENT_MAX ๋งํผ์ ์ฌ์ด์ฆ๋ฅผ ๊ฐ๋๋ค.
์ดํ ํธ๋ค๋ฌ๋ ๋ง์ฝ ๊ฐ์ ์ ์ผ๋ก ์ข
๋ฃ๊ฐ ๋์์ ๊ฒฝ์ฐ ์ฒ๋ฆฌ๋ฅผ ์ํ signal handler๋ค.
ํ ์ฐ๋ ๋์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ์์์ธ CLIENTS, SENDER ์ ์ญ๋ณ์์ ์ฌ์ฉ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ mutex lock์ ์งํํ์ฌ race condition์ ์๋ฐฉํ์๊ณ , lock์ด ๊ฑธ๋ฆฐ ์ดํ์๋ ๋ชจ๋ ์ด๋ฆฐ CLIENT socket์ ๋ซ๊ณ ํ์ ์ ์ฅ๋ ์ด๋ฆ๊ฐ์ ํด์ ํ ๋ค mutex unlock์ ์งํํ๋ฉฐ, ์ต์ข
์ ์ผ๋ก ์ด์ฉ ์ข
๋ฃ ๋ฌธ๊ตฌ ์ถ๋ ฅ ํ exitํจ์๋ฅผ ํตํด ๋ฐ์ด๋๋ฆฌ๊ฐ ์ข
๋ฃ๋๋ค.
์ดํ์ ์กด์ฌํ๋ pthread_mutex_lock ๋ฐ unlock ํจ์์ ์ฌ์ฉ์ ๋ชจ๋ critical section์ ์ ๊ทผ์ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ผ๋ ๊ฐ์ ๋ชฉ์ ์ ์ํด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ค๋ช
์ ์๋ตํ๊ฒ ๋ค. ๋ํ, mutex lock ๋ฐ unlock์ ์๋ฌด ๊ณณ์์๋ ๋จ์ฉํ์ง ์์๋ค.
๊ตฌํ๋ ํจ์๋ค(์ดํ ์ค๋ช
)์ ํตํด ๊ตฌํ๋๋ค.
๋จผ์ , ์ถํ์ ๋ฌดํ ๋ฐ๋ณต์ ์งํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ์ ์ข
๋ฃ๋ฅผ ํตํ Interrupt์ด๋ abort๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ signal ์ฒ๋ฆฌ๋ฅผ ์ ์ธํ๋ค.
๋, recvRuntine๊ณผ sendRutine์ ์๋ํ ์ฐ๋ ๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ์ฐ๋ ๋ ๋ณ์๋ฅผ ์ ์ธํ๋ค.
recvRutine ๊ฒฝ์ฐ ๊ฐ (์ต๋ 5๊ฐ์)์์ผ ๋คํธ์ํฌ๋ง๋ค ๋ชจ๋์ ์
๋ ฅ์ ๋ฐ์์์ผํ๊ธฐ ๋๋ฌธ์ ์ฐ๋ ๋ ์ฌ์ด์ฆ 5์ ๋ฐฐ์ด์ ์ ์ธํ๋ค.
๊ทธ ์ดํ์ ์ธ์๋ฅผ ํตํด port๋ฅผ ๋ฐ์์ค๊ณ , sendRoutine์ ์คํํ๋ ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ค.
์ดํ ๋ฌดํ๋ฐ๋ณต ๋ฃจํ๋ฅผ ํตํด ๋ฐ์์จ port๋ฅผ ํตํด socket์ ํ์ฑ ๋ฐ ์ฐ๊ฒฐ์ ์์ฉํ๊ณ client์ ๋ณด๋ฅผ ์ ์ญ๋ณ์์ ์ ์ฅํ๋ฉฐ, ๊ฐ client ์์ผ๋ง๋ค recvRoutine ์ฐ๋ ๋๋ฅผ ์์ฑํ๋ค.
์ด ๊ณผ์ ์ ๊ฐ์ ๋ก ์ข
๋ฃํ๊ธฐ ์ ๊น์ง ๋ฌดํ ๋ฐ๋ณต๋๋ค.
๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ ์ฐ๋ ๋ ๋ฃจํด์ธ๋ฐ, ๋ง์ฝ SENDER์ used๋ฉค๋ฒ ๋ณ์๊ฐ set ๋์ด์๋ค๋ฉด, ์์ ์ค๋ช
ํ sendMsgํจ์๋ฅผ ํตํด SENDER๋ฅผ ์ ์ธํ ๋ชจ๋ ์ด๋ฆฐ socket์๊ฒ SENDER์ buffer๋ฅผ ์ ์กํ๋ค.
๋ค๋ง ๋ง์ฝ SENDER ์์ผ์ DISCONNECT๋ฅผ ์๋ฆฌ๋ ๊ฒฝ์ฐ์๋ ๋ด๋ถ ์ ์ก ๊ณผ์ ๋ง ์กฐ๊ธ ๋ค๋ฅด๋ค.
์ดํ์ ๋ชจ๋ ์ ์ก์ด ๋๋ฌ๋ค๋ฉด server์๊ฒ๋ printf๋ก ๋๊ฐ์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ฉฐ, ์ฌ์ฉ๋ buffer๋ฅผ ๋ชจ๋ free์ํค๊ณ pointer๋ NULL๋ก ๊ฐ์ ์ฌํ ๋นํ๋ค.
5๊ฐ์ ์ฐ๋ ๋๊ฐ ๋์์ ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ ๋ฃจํด์ธ๋ฐ, ๋ง์ฝ ํ socket์ด๋ผ๋ recvMsgํจ์๋ฅผ ํตํด message๋ฅผ ๋ฐ์์๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ฃจํด์ ์งํํ๋ค.
๋ง์ผ ๋ฐ์์จ client์ ์ด๋ฆ์ด ์กด์ฌํ์ง ์๋๋ค๋ฉด,
- ๋ฐ์์จ ๋ฉ์์ง๋ฅผ strdup๋ฅผ ํตํด ์๋ก ํ์ ํ ๋นํ์ฌ ์ ์ญ๋ณ์์ ์ ์ฅํ๊ณ
- ํด๋น ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ์๋ฒ์ ์ถ๋ ฅํ๋ค
- ์ดํ ์ด๋ฆฐ ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ๋ ์ฐ๊ฒฐ ์๋ฆฝ์ ์๋ฆฐ๋ค.
๋ง์ฝ ์ด๋ฆ์ด ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด,
- ๋ฐ์์จ ๋ฉ์์ง์ ๋ํ ๋ชจ๋ ์ ๋ณด๋ฅผ SENDER์ ํ ๋นํ๊ณ
sendRoutine์ด ์ ์์ ์ผ๋ก ๋ชจ๋ ํด๋ผ์ด์ธํธ์๊ฒ SENDER์ ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์๋๋ก ์ ์ญ๋ณ์ ๊ฐ์ setํ๋ค.- ๋ง์ฝ ์ฐ๊ฒฐ ์ข
๋ฃ๋ฅผ ์๋ฆฌ๋
QUIT๋ฉ์์ง์ผ ๊ฒฝ์ฐ์๋ ๋ชจ๋ CLIENT์ ์ ๋ณด๋ฅผ ์ฒ์์ผ๋ก ์ด๊ธฐํํ๋ฉฐ ํ ๋น๋ ํ๋ ํด์ ํ๋ค.
๋ชจ๋ ๋ฃจํด์ด ์ข ๋ฃ๋์์ ๊ฒฝ์ฐ ์ ๋ ฅ๋ฐ์ message๋ฅผ ์ข ๋ฃํ๊ณ ๋ค์ ์ฒ์์ผ๋ก ๋์๊ฐ ๋ฃจํด์ ์ฌ์์ํ๋ค.
client์์ ์ฌ์ฉ๋๋ ํจ์๋ค์ ๋ฏธ๋ฆฌ ์ ์ธํด๋จ๋ค.
์์ ์ค๋ช ํ server์ validator์ ๋ชจ๋ ๋ฃจํด๊ณผ ๊ฑฐ์ ์ ์ฌํ๋ค. ์์ธํ ์ค๋ช ์ ์๋ตํ๋ค.
๋๊ฒจ๋ฐ์ ์ธ์๋ฅผ ํจ์ ๊ธฐ๋ฅ์ ์๋ง๊ฒ, ๊ฐ์ ๋ฐํํ๋๋ก ๊ตฌํ๋์ด์๋ค.
๋จผ์ addr์ family๋ฅผ ์ค์ ํ๊ณ , inet_pton API๋ฅผ ํตํด addr์ IP ์ฃผ์๋ฅผ ์ฝ์
ํ๋ค.
์ดํ addr.sin_port ๋ณ์์ port๊ฐ์ htons API๋ฅผ ํตํด big endian์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๊ณ , ์์ผ ์์ฑ ๋ฐ connect๋ฅผ ์งํํ๋ค.
์ด ๋, connect๊ณผ์ ์์ 3-way handshake ๊ณผ์ ์ค ํ๋์ธ syn packet ๋ณด๋ด๊ธฐ ๋ฐ syn, ackํจํท ์ ์ก๋ฐ๊ธฐ, ackํจํท ์ฌ์ ์ก์ด ๋ชจ๋ ์ด๋ค์ง๋ค.
์ฑ๊ณต์ ์ผ๋ก socket ์์ฑ ๋ฐ ์ฐ๊ฒฐ์ด ์งํ๋๋ค๋ฉด socket fd๋ฅผ ๋ฐํํ๋ค.
๋ชจ๋ ์ฐ๋ ๋์์ ์ฌ์ฉ๋ socket์ FD์, loop ๋์์ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ L, ๊ทธ๋ฆฌ๊ณ client์ ์ด๋ฆ์ ์ ์ฅํ๋ NICKNAME ์ ์ญ๋ณ์ ์ธ ๊ฐ๊ฐ ์ ์ธ๋์ด์๋ค.
๊ทธ ๋ฐ์๋ ๊ฐ ํธ๋ค๋ฌ๊ฐ ์ ์ธ๋์ด์๋๋ฐ, abort์ ๊ฒฝ์ฐ ์ฐ๊ฒฐ ์๋ฆฝ ์คํจ์ด๋ฏ๋ก ์ฐ๊ฒฐ ์คํจ์ ๋ํ ์๋ฆผ์ ์ถ๋ ฅํ๊ณ , interrupt์ ๊ฒฝ์ฐ ๊ฐ์ ์ข
๋ฃ์ด๋ฏ๋ก, ๋ชจ๋ ์ข
๋ฃ ๋ฃจํด์ ๋ฐ๋ฅผ ์ ์๋๋ก handlingํ ์ดํ ๋ฐ์ด๋๋ฆฌ๊ฐ ์ข
๋ฃ๋๋ค.
L ๋ณ์๋ก ์ข
๋ฃ ์ฌ๋ถ๋ฅผ ํ๋จํ์ฌ L ๋ณ์๊ฐ unset ๋ ๋๊น์ง ๋ฌดํ ๋ฃจํ๋ฅผ ๋๊ณ , readBufํจ์๋ฅผ ํตํด message๋ฅผ ์
๋ ฅ๋ฐ๋๋ค.
์
๋ ฅ๋ฐ์ message๋ฅผ ์๋ฒ ์์ผ์ ์ ์กํ๋ค.
๋ง์ผ ์
๋ ฅ๋ฐ์ message๊ฐ ์ข
๋ฃ๋ฅผ ์๋ฏธํ๋ QUIT์ผ ๊ฒฝ์ฐ, ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ๋ค L ๋ณ์๋ฅผ 0์ผ๋ก setํ์ฌ, ์๋ฒ์ ์ฐ๊ฒฐ ์ข
๋ฃ ๋ฐ ๋ฐ์ด๋๋ฆฌ ์ข
๋ฃ๋ฅผ ์งํํ๋ค.
L ๋ณ์๋ก ์ข
๋ฃ ์ฌ๋ถ๋ฅผ ํ๋จํ์ฌ L ๋ณ์๊ฐ unset ๋ ๋๊น์ง ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ฉฐ recvMsg ํจ์๋ฅผ ์งํํ๋ค.
recvMsg ํจ์๋ก ๋ฐ์์จ message๋ฅผ ๋จ์ํ ์ถ๋ ฅํ๋ ๊ฒ์ด ์ ๋ถ๋ค.
setupํจ์๋ฅผ ํธ์ถํ์ฌ file stream์ ์ ๋ฆฌํ๊ณ , signal ํจ์๋ฅผ ํตํด ABORT์ INTERRUPT๋ฅผ ํธ๋ค๋งํ๋ค.
์ดํ ์ธ์๋ฅผ ํตํด ip, port๋ฅผ getํ๊ณ , ๋๊ฒจ๋ฐ์ NICKNAME์ ํ์ผ๋ก ์ฌํ ๋นํ์ฌ ์ ์ญ๋ณ์์ ์ ์ฅํ๋ค.
์ดํ์ NICKNAME์ ์๋ฒ์๊ฒ ์ ์กํ๊ณ , ์ฐ๊ฒฐ ์๋ฆฝ์ ์ค์ค๋ก ์ถ๋ ฅํ ๋ค L ์ ์ญ๋ณ์๋ฅผ setํ๊ณ ์ด์ ์ ์ค๋ช
ํ ์ฐ๋ ๋๋ฅผ ๊ฐ๊ฐ ์คํ์ํจ๋ค.
์ดํ์ join์ ํตํด sendThread์ ์ข
๋ฃ๋ฅผ ๋๊ธฐํ๋๋ฐ, ์ด๋ ์๋ฒ์์ ์ฐ๊ฒฐ์ ์ข
๋ฃ๋ฅผ ์๋ฏธํ๋ค.
sendThread๊ฐ ์ฐ๊ฒฐ ์ข
๋ฃ๋์๋ค๋ฉด, recvThread๋ ๊ฐ์ ๋ก ์ข
๋ฃ์ํค๊ณ , server FD๋ซ๊ธฐ ๋ฐ, NICKNAME ํ ๊ณต๊ฐ ํด์ ๋ฅผ ์งํํ๋ค.
connection์ด ์ฑ๊ณตํ ๊ฒฝ์ฐ, (3-way handshake) ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ณ ๋ํ๋ฅผ ์ค๊ฐํ๋ค. ๊ฐ ํด๋ผ์ด์ธํธ ์ญ์ ์๋ก ์ฐ๊ฒฐ๋ ์ ์ ์ ์ฐ๊ฒฐ์ ํ์ธํ ์ ์๊ณ , ๊ฐ์ ์ฐ๊ฒฐ ์ดํ ๋ํ๋ฅผ ์งํํ ์ ์๋ค.
QUIT๋ฅผ ์
๋ ฅํ์ ์ข
๋ฃ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ ์ด์ ์คํฌ๋ฆฐ์ท์ ํ์ธํ๋ฉด, ์ข
๋ฃ ์ ๋ณด ๋ํ ๋ชจ๋ ํด๋ผ์ด์ธํธ์ ์๋ฒ์ ์ถ๋ ฅ๋จ์ ์ ์ ์๋ค.

























