TCP/IP는 socket관련 API를 통하여 socket을 생성합니다.
TCP/IP socket 통신 함수 호출 순서
TCP/IP의 Server와 Client의 기본적인 socket 생성과 접속 및 데이터 송수신의 흐름은 아래와 같습니다.
Server TCP/IP Flow
서버 Socket의 생성 및 처리 절차는 다음과 같습니다.
1. socket(2)함수를 통하여 socket을 생성합니다.
TCP/IP는 IP 기반이므로 Address Family를 AF_INET 설정하고 TCP는 연결지향형으므로 SOCK_STREAM으로 설정합니다.
int server_fd;
if((sever_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
fprintf(stderr, "SERVER SOCKET 생성 오류: %s\n", strerror(errno));
return -1;
}
2. 생성된 socket에 bind(2)함수를 통하여 서버 port번호를 설정합니다.
struct sockaddr_in server;
/* PORT번호를 재활용으로 설정합니다. */
setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
if(bind(server_fd, (struct sockaddr *)&server, sizeof(struct sockaddr_in)) == -1) {
fprintf(stderr, "SERVER SOCKET 생성 오류: %s\n", strerror(errno));
return -1;
}
3. listen(2)함수는 서버 port번호가 설정된 socket을 통신이 가능하도록 서버 socket이 동작하게 됩니다. 또한 접속한 client가 accept를 하지 못한 경우에 queue크기만큼 쌓아두게 되며, queue 크기보다 많은 접속은 오류 처리됩니다.
if(listen(server_fd, 50) == -1) {
return -1;
}
4. accept(2)는 client의 connect(2)에 대해 접속을 허락하고 client와 통신할 수 있는 새로운 socket을 생성합니다.
accept(2)를 통해서 생성된 socket descriptor로 각 각의 client와 실질적인 통신을 할 수 있습니다.
int connected_fd;
socklen_t addr_len = 0;
struct sockaddr_in client
addr_len = sizeof(struct sockaddr_in);
if((connected_fd = accept(server_fd, (struct sockaddr *)&client, &addr_len)) == -1) {
return -1;
}
5. recv(2)/send(2)는 connected_fd를 통하여 이루어집니다.
동시에 접속한 여러개의 client의 요청에 대해 Server는 Multi-Process나 Multi-thread 등의 구조로 client의 요청을 수용할 수 있는 구조로 설계를 하고 구현해야 합니다.
accept 이후에는 multi-process, multi-thread, multiplexing 등의 기법으로 요청한 client와 1:1로 데이터 전문을 처리하는 부분입니다.
client요청과 서버의 응답에 대해 전문의 header, body 등을 정의하고 전송할 데이터의 크기 등을 어떻게 설정할 것인 지 등 상세한 전문 설계가 필요합니다.
전문의 설계에 따라 client의 send(2)에 대해서 server는 recv(2)로 대기하고 결과를 전송하면, client는 recv(2)하는 등의 데이터를 주고 받는 흐름대로 송수신합니다.
6. close(2)
데이터 송수신이 마무리되면 더 이상 접속을 유지할 필요가 없는 경우에, connected_fd를 close합니다.
see also : TCP/IP 통신 프로그램 Socket 통신 관련 Library
'C언어 응용 > TCP·IP' 카테고리의 다른 글
TCP/IP - 6. 공통 라이브러리 만들기(정보 제공 함수) (0) | 2019.10.01 |
---|---|
TCP/IP - 5. 공통 라이브러리 만들기(기본함수) (0) | 2019.10.01 |
TCP/IP - 4. Client 처리 flow (0) | 2019.10.01 |
TCP/IP - 2. port 번호 범위 (2) | 2019.10.01 |
TCP/IP - 1. 기본 용어 (2) | 2019.10.01 |