๐ ๊ณต๋ถํ๋ ์ง์ง์ํ์นด๋ ์ฒ์์ด์ง?
[์๋์ฐจ ๋ทํธ์ LCDํ์ผ๋ก ์ํฉ ์ ๋ฌํ๊ธฐ 2] TCP/IP ํต์ ํจ์ ์ฌ์ฉ ์์ ๋ณธ๋ฌธ
๐ฉโ๐ป IoT (Embedded)/Arduino
[์๋์ฐจ ๋ทํธ์ LCDํ์ผ๋ก ์ํฉ ์ ๋ฌํ๊ธฐ 2] TCP/IP ํต์ ํจ์ ์ฌ์ฉ ์์
์ง์ง์ํ์นด 2023. 11. 10. 11:41728x90
๋ฐ์ํ
โญ ์์ผ
- ๋ ํ๋ก๊ทธ๋จ์ด ๋คํธ์ํฌ๋ฅผ ํตํด ์๋ก ํต์ ํ ์ ์๋๋ก ์์ชฝ์ ์์ฑ๋๋ ๋งํฌ์ ๋จ์
- ์์ผ์ด ์ฐ๊ฒฐ๋๋ฉด ์๋ก ๋ค๋ฅธ ํ๋ก์ธ์ค๋ผ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ์ ์์

๐ Server
1) socket()
Socket discriptor ์์ฑ
int socket(int domain, int type, int protocol);
- ์ฑ๊ณต ์ fd (ํ์ผ ๋์คํฌ๋ฆฝํฐ), ์คํจ ์ -1
- domain : ์ฃผ์ ์์ญ ์ค์ (AF_INET(IPv4), AF_INET(IPv6))
- type : ์์ผ์ ํต์ ํ์ ์ค์
- protocol : ํต์ ์ ์ฌ์ฉํ ํ๋กํ ์ฝ ์ค์
- memset ์ผ๋ก ์ฃผ์๋ฅผ ๋ถ์ฌ
- serv_sock์ bind๋ก ์ฃผ์ ๋ฃ๊ธฐ ์ํ ๋ฐ์์
memset(&serv_addr,0,sizeof(serv_addr)); serv_addr.sin_family=AF_INET; serv_addr.sin_addr.s_addr=htonl(INADDR_ANY); serv_addr.sin_port=htons(atoi(argv[1]));
2) bind()
์์ฑํ socket์ IP addr, portnumber ๋ฅผ ํ ๋นํ์ฌ ์ปค๋์ server socket์ผ๋ก ๋ฑ๋ก
int bind(int sockfd, struct sockaddr* myaddr, socklen_t addrlen);
-
- ์ฃผ์ ์ ๋ณด (IP, PORT)๋ฅผ ํ ๋นํด์ค์ผ ํจ
- ์ปค๋์ ๋ฑ๋กํด์ผ ๋ค๋ฅธ ์์คํ ๊ณผ ํต์ ํ ์ ์๋ ์ํ๊ฐ ๋จ
- bind ์ ์ฌ์ฉํ ๊ตฌ์กฐ์ฒด๋ sockaddr_in ๊ตฌ์กฐ์ฒด (Socket sockaddr, sockaddr_in, sockaddr_un)
- ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ๋ณ์
struct sockaddr_in { sa_family_t sin_family; ์ฃผ์์ฒด๊ณ(Address Family) uint16_t sin_port; 16๋นํธ TCP/UDP PORT๋ฒํธ struct in_addr sin_addr; 32๋นํธ์ IP์ฃผ์ char sin_zero[8]; ์ฌ์ฉ๋์ง ์์ -> ?? } struct in_addr{ in_addr_t s_addr; 32๋นํธ์ IPv4 ์ธํฐ๋ท ์ฃผ์๊ฐ ๋ด๊ธด๋ค. } struct sockaddr { sa_family_t sin_family ์ฃผ์์ฒด๊ณ(Address Family) char sa_data[14]; ์ฃผ์์ ๋ณด }
- ์ฑ๊ณต ์ 0, ์คํจ ์ -1 ๋ฐํ
- sockfd : ์์ฑํ ์์ผ์ fd ์ ๋ฌ
- myaddr : ์ฃผ์ ์ ๋ณด
- addrlen : myaddr ์ ํฌ๊ธฐ
- ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ๋ณ์
3) listen()
server socket ์ ํตํด ํด๋ผ์ด์ธํธ์ ์ ์ ์์ฒญ์ ํ์ธ
int listen(int sockfd, int backlog);
- ์ฑ๊ณต ์ fd, ์คํจ ์ -1 ๋ฐํ
- sockfd : ์์ผ์ fd ์ ๋ฌ
- backlog : ์ฐ๊ฒฐ ์์ฒญ ๋๊ธฐ์ด์ ํฌ๊ธฐ ์ค์
4) accept()
ํด๋ผ์ด์ธํธ ์ ์ ์์ฒญ ๋๊ธฐ ๋ฐ ์๋ฝ, ํด๋ผ์ด์ธํธ์์ ํต์ ์ ์ํ ์ socket ์์ฑ
int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
- sockfd : ์์ผ์ fd ์ ๋ฌ
- addr : ์ฐ๊ฒฐ ์์ฒญํ ํด๋ผ์ด์ธํธ์ ์ฃผ์ ์ ๋ณด (์ ๋ณด ํ์ธ, ๋ก๊ทธ ์ ์ฅ ๋ชฉ์ )
- addrlen : addr ์ ํฌ๊ธฐ
5) read()/write()
socket ์ผ๋ก ๋ฐ์ดํฐ ์ก์์
read(int fd, void *buff, size_t nbytes)
write(int fd, const void *buf, size_t nbytes);
- read ํจ์์ ๋งค๊ฐ๋ณ์
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ์๋ฃ ์์ ํ๋ค.
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ์๋ฃ๊ฐ ์๋ค๋ฉด ์ก์ ํ ๋ ๊น์ง ๋๊ธฐํ๋ค
- fd : ์ด๋ฆฐ ํ์ผ์ ์ง์ ๋ฒํธ. ์ฌ๊ธฐ์ fd๋ ์์ผ ์ง์ ๋ฒํธ๋ค.
- buff : ์ฝ์ด๋ค์ธ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฒํผ ๋ณ์
- count : ๋ฐ์ดํฐ์ count ํฌ๊ธฐ
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ์๋ฃ ์์ ํ๋ค.
- memset ํจ์
- ๋ฉ๋ชจ๋ฆฌ์ ์์์ ๋ถํฐ ์ฐ์๋ ๋ฒ์๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ง์ ํ๊ณ ์ถ์๋ ์ฌ์ฉ๋๋ค.
- ptr : ๋ฉ๋ชจ๋ฆฌ ์์ ํฌ์ธํฐ
- value : ์ฑ์ฐ๋ ๊ฐ
- num : ์ฑ์ฐ๋ ค๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ
- ๋ฉ๋ชจ๋ฆฌ์ ์์์ ๋ถํฐ ์ฐ์๋ ๋ฒ์๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ง์ ํ๊ณ ์ถ์๋ ์ฌ์ฉ๋๋ค.
- write ํจ์์ ๋งค๊ฐ๋ณ์
- ํด๋ผ์ด์ธํธ๋ก ์๋ฃ๋ฅผ ์ก์ ํ๋ค
- fd : ์ด๋ฆฐ ํ์ผ์ ์ง์ ๋ฒํธ. ์์ผ ์ง์ ๋ฒํธ
- buf : ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ๊ฐ, ๋ณด๋ผ ๋ฐ์ดํฐ
- count : ๋ฐ์ดํฐ์ count ํฌ๊ธฐ
6) close()
ํต์ ์ ์๋ฃํ๋ฉด socket ์ ์๋ฉธ
close(int fd);
- sockfd : ์์ผ ์ง์ ๋ฒํธ
๐ Client
1) socket()
Socket discriptor ์์ฑ
int socket(int domain, int type, int protocol);
- ์ฑ๊ณต ์ fd (ํ์ผ ๋์คํฌ๋ฆฝํฐ), ์คํจ ์ -1
- domain : ์ฃผ์ ์์ญ ์ค์ (AF_INET(IPv4), AF_INET(IPv6))
- type : ์์ผ์ ํต์ ํ์ ์ค์
- protocol : ํต์ ์ ์ฌ์ฉํ ํ๋กํ ์ฝ ์ค์
- memset ์ผ๋ก ์ฃผ์๋ฅผ ๋ถ์ฌ
- serv_sock์ bind๋ก ์ฃผ์ ๋ฃ๊ธฐ ์ํ ๋ฐ์์
// serv_sock์ bind ๋ก ์ฃผ์ ๋ฃ๊ธฐ ์ํ ๋ฐ์์ memset(&serv_adr, 0, sizeof(serv_adr)); // Prepare the address serv_adr.sin_family = AF_INET; // type : IPv4 serv_adr.sin_addr.s_addr = inet_addr(argv[1]); // ip์ฃผ์ serv_adr.sin_port = htons(atoi(argv[2])); // ํฌํธ๋ฒํธ
2) bind()
server ๋ก ์ฐ๊ฒฐ ์๋
int connect(int sockfd, struct sockaddr* serv_addr, socklen_t addrlen);
- ์๋ฒ์์ accept ํ๋ค๋ฉด ํด๋ผ์ด์ธํธ์ชฝ์์ ์ฐ๊ฒฐ ์์ฒญํด์ผ ํจ
- ์ฃผ์ ์ ๋ณด์ ์๋ฒ์ ์ฃผ์์ ํฌํธ๋ฒํธ๋ฅผ ์ง์ ํ๊ณ ์๋ฒ์ ์ฐ๊ฒฐ ์๋
- sockfd : ์์ผ ์ง์ ๋ฒํธ
- serv_addr : ์๋ฒ์ ip์ฃผ์ ํฌํธ ์ ๋ณด
- addrlen : addr ์ ํฌ๊ธฐ
3) read()/write()
socket ์ผ๋ก ๋ฐ์ดํฐ ์ก์์
read(int fd, void *buff, size_t nbytes)
write(int fd, const void *buf, size_t nbytes);
- read ํจ์์ ๋งค๊ฐ๋ณ์
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ์๋ฃ ์์ ํ๋ค.
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ์๋ฃ๊ฐ ์๋ค๋ฉด ์ก์ ํ ๋ ๊น์ง ๋๊ธฐํ๋ค
- fd : ์ด๋ฆฐ ํ์ผ์ ์ง์ ๋ฒํธ. ์ฌ๊ธฐ์ fd๋ ์์ผ ์ง์ ๋ฒํธ๋ค.
- buff : ์ฝ์ด๋ค์ธ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฒํผ ๋ณ์
- count : ๋ฐ์ดํฐ์ count ํฌ๊ธฐ
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ ์ก๋ ์๋ฃ ์์ ํ๋ค.
- memset ํจ์
- ๋ฉ๋ชจ๋ฆฌ์ ์์์ ๋ถํฐ ์ฐ์๋ ๋ฒ์๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ง์ ํ๊ณ ์ถ์๋ ์ฌ์ฉ๋๋ค.
- ptr : ๋ฉ๋ชจ๋ฆฌ ์์ ํฌ์ธํฐ
- value : ์ฑ์ฐ๋ ๊ฐ
- num : ์ฑ์ฐ๋ ค๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ
- ๋ฉ๋ชจ๋ฆฌ์ ์์์ ๋ถํฐ ์ฐ์๋ ๋ฒ์๋ฅผ ํน์ ๊ฐ์ผ๋ก ์ง์ ํ๊ณ ์ถ์๋ ์ฌ์ฉ๋๋ค.
- write ํจ์์ ๋งค๊ฐ๋ณ์
- ํด๋ผ์ด์ธํธ๋ก ์๋ฃ๋ฅผ ์ก์ ํ๋ค
- fd : ์ด๋ฆฐ ํ์ผ์ ์ง์ ๋ฒํธ. ์์ผ ์ง์ ๋ฒํธ
- buf : ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ๊ฐ, ๋ณด๋ผ ๋ฐ์ดํฐ
- count : ๋ฐ์ดํฐ์ count ํฌ๊ธฐ
4) close()
ํต์ ์ ์๋ฃํ๋ฉด socket ์ ์๋ฉธ
close(int fd);
- sockfd : ์์ผ ์ง์ ๋ฒํธ
728x90
๋ฐ์ํ