์์ผ์ด๋ ๋ฌด์์ธ๊ฐ?
์ ํ๋ฆฌ์ผ์ด์
ํ๋ก์ธ์ค๋ผ๋ฆฌ์ ํต์
-> ํด๋ผ์ด์ธํธ ํ๋ก์ธ์ค - ์๋ฒ ํ๋ก์ธ์ค ๊ฐ์ ํต์
โ OS๊ฐ ์ ๊ณตํด์ฃผ๋ API์ ์ผ์ข
์ด๋ผ๊ณ ๋ณผ ์ ์๋ค
ใ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐ๋ก ๋ฐ์ ์๋ Transport Layer๊ฐ ์ ๊ณตํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค.
ใ-> TCP socket or UDP socket
Socket API (TCP)
โ ์๋ฒ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ ์ด๋ค(ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋์์ฌ ๋๊น์ง ๋๊ธฐ)
โ ํด๋ผ์ด์ธํธ๊ฐ connect ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ ์์ผ์ด ์ฐ๊ฑธ๋๋ค. (Read - Write)
Socekt ๊ฐ ์ฐ๊ฒฐ๊ณผ์ ๊ณผ ํจ์๋ค
Function: socket
โ int type: ํด๋น ์์ผ์ด UDP type ์ธ์ง TCP type์ธ์ง ๊ฒฐ์ ํด์ฃผ๋ ์ธ์
โ ์์ฑํ ์์ผ์ id / idx ๋ฐํ
Function: bind
โ ์์ฑ๋ ์์ผ ์์ด๋๋ฅผ ํน์ ํฌํธ์ ๊ฒฐํฉ
Function: listen
โ ์์ฑ๋ ์์ผ์ listen ์ฉ๋๋ฅผ ์ฌ์ฉํ ๊ฒ์ด๋ฉฐ, ์์ฒญ๋ค์ ํ์ ๋ด์๋๊ณ ์ฒ๋ฆฌํ๋๋ก ํจ (backlog)
Function: accept
โ ์ค๋น๊ฐ ๋๋์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฌ๋๋ก ํจ
โ ํด๋ผ์ด์ธํธ์ ip์ฃผ์์ port์ฃผ์๋ฅผ ๋ฐ๊ฒ ๋๋ค
์ฐ๊ฒฐ ๊ณผ์ ์ ๋ฆฌ
Function: connect
โ (ํด๋ผ์ด์ธํธ๊ฐ) ๋ค๋ฅธ ์์ผ(์๋ฒ)์ ์ฐ๊ฒฐ ์์ฒญ์ ๋ณด๋
* ํด๋ผ์ด์ธํธ๋ ์ bind ํจ์๋ฅผ ์ฌ์ฉํ์ง ์์๊น?
โ ํด๋ผ์ด์ธํธ๋ ์น ์๋ฒ์ ๋ค๋ฅด๊ฒ ํน์ port์ ๊ฒฐํฉํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ! (์๋ฌด๊ฑฐ๋ ์ฐ๋ฉด ๋๋ค)
Sample code: server
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define PORT 3490 /*ํฌํธ ๋ฒํธ*/
#define BACKLOG 10 /*์ต๋ ์ ์ ๊ฐ๋ฅ ํ*/
main()
{
/* ์์ผ ์์ฑ (sockfd: ์์ผ ์์ด๋(์์), SOCK_STREAM: TCP๋ฐฉ์) */
int sockfd, new_fd; /*listen on sock_fd, new connection on new_fd */
struct sockaddr_in my_addr; /*my address*/
struct sockaddr_in their_addr; /*connecttor addr*/
int sin_size;
/*
sockaddr_in ๊ตฌ์กฐ:
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
};
sin_family = AT_INET
sin_port: port #(0-65535)
sin_addr: IP-address
*/
if((sockfd = socket(PF_INET, SOCK_STREAM, 0))==-1){
perror("socket");
exit(1);
}
/* my_addr์ ์์ผ์ ์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋ค*/
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT); /*short, network byte order */
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* INADDR_ANY allows clients to connect to any one of the host's IP address*/
if(bind(sockfd,(struct sockaddr *)&my_addr, sizeof(struct sockaddr))==-1){
perror("bind");
exit(1);
}
if(listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
while(1) { /*main accept() loop*/
sin_size = sizeof(struct sockaddr_in);
/*accept() -> ํด๋ผ์ด์ธํธ์์ ์์ฒญ์ด ์ฌ๋๊น์ง ๋๊ธฐ(block) ์ํ */
if((new_fd = accept(sockfd, (struct sockaddr*)&their_addr,&sin_size))==-1){
perror("accept");
continue;
}
/* ํด๋ผ์ด์ธํธ์ ์ ๋ณด๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค (์ ์ํ ํด๋ผ์ด์ธํธ ์ ๋ณด ์ถ๋ ฅ)*/
printf("server: got connection form %s\n". inet_ntoa(their_adddr.sin_addr));
}
}
Sample code: client
/* ์์ผ ์์ฑ (SOCK_STREAM: TCP) */
if((sockfd = socket(PF_INET, SOCK_STREAM, 0))==-1){
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(Server_Portnumber);
their_addr.sin_addr = htonl(Servel_IP_address);
/* ์๋ฒ ์์ผ๊ณผ ์ฐ๊ฒฐ(์๋ฒ ์ฃผ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค) */
if(connect(sockfd,(struct sockaddr*)&their_addr, sizeof(struct sockaddr))==-1){
perror("connect");
exit(1);
}
Read - Write (์ฐ๊ฒฐ ์ดํ)
Functions: write
Functions: read
โ ์ฐ๊ฒฐ ์ดํ์ ๊ทธ๋ฅ ๋ฐ์ดํฐ(string)์ ์ฃผ๊ณ ๋ฐ๋ ๊ณผ์
Close
Functions: close
โ ๋ฐ์ดํฐ ๊ตํ์ด ๋๋ ์ดํ ๋ค๋ฅธ ์ด์ฉ์๊ฐ ์ด์ฉํ ์ ์๋๋ก ์ฌ์ฉํ ์์ผ์ release ํด์ค๋ค
Socket API (UDP)
โ UDP๋ ํจ์ฌ ๋จ์ํ๋ค
'โญ Group_Study > Networking' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[2์ฃผ์ฐจ] Connectionless transport : UDP (0) | 2022.09.27 |
---|---|
[2์ฃผ์ฐจ] Transport Layer- Multiplexing_Demultiplexing (0) | 2022.09.27 |
[1์ฃผ์ฐจ] ์ปดํจํฐ ๋คํธ์ํฌ ๊ธฐ๋ณธ 2 (0) | 2022.09.25 |
[1์ฃผ์ฐจ] ์ปดํจํฐ ๋คํธ์ํฌ ๊ธฐ๋ณธ 1 (0) | 2022.09.25 |
[0์ฃผ์ฐจ] ๋คํธ์ํฌ ์คํฐ๋ ์์ (0) | 2022.09.25 |
๋๊ธ