4-1 TCP기반 서버, 클라이언트 구현
먼저 TCP 서버 구현을 위한 기본적인 함수 호출 순서를 알아보자.
앞서 Socket() 소켓 생성 함수와 bind() 소켓 주소할당 함수를 알아보았다면 이번에는 listen() 연결 요청 대기상태 함수와 accept() 연결허용 함수를 알아볼 시간이다.
1) Listen( ) => 연결 요청 대기상태
#include <sys/socket.h> int listen(int sock, int backlog); |
첫 번째 인자인 sock는 연결 요청 대기상태에 두고자 하는 파일 디스크립터를 전달하고 두 번째 인자인 backlog는 연결요청 대기 큐(QUEUE)의 크기정보를 전달한다. 예를 들어 5가 전달되면 큐의 크기가 5가 되어 클라이언트 연결요청을 5개까지 대기시킬 수 있다. 이렇게 listen 함수 호출을 통해 클라이언트 연결요청이 들어왔다면 들어온 순서대로 연결요청을 수락해야하는데 그 함수가 바로 accept 함수이다.
2) accept( ) => 연결허용 함수
#include <sys/socket.h> int accept(int sock, struct sockaddr* addr, socklen_t * addrlen); |
첫 번째 인자인 sock은 서버소켓의 파일 디스크립터이고 두 번째 인자인 addr는 연결요청을 한 클라인언트 주소정보를 담을 변수의 주소 값이다. 그리고 세 번째 인자는 두 번째 인자의 주소의 변수 크기를 바이트 단위을 의미한다.
여기서 중요한 점은 호출 성공 시 내부적으로 데이터 입출력에 사용할 소켓을 자동으로 생성한다는 점이다. 그리고 그 소켓이 클라이언트 소켓에 연결가지 이뤄진다. 앞서 만들어진 소켓은 문지기 역할을 하고 실질적인 연결은 accept상에서 만들어진 소켓에서 이루어진다는 점을 꼭 기억해야한다!!
그렇다면 TCP 클라이언트의 기본적인 함수 호출은 어떨까?
대표사진 삭제
사진 설명을 입력하세요.
클라이언트 구현과정은 연결을 요청하는 과정이기 때문에 서버 구현보다 간단하다. Socket() 함수 다음으로 실행되는 connect() 함수에 대해 알아보자
*connect()=> 연결요청 함수
#include <sys/socket.h> int connect(int sock, struct sockaddr* servaddr, socklen_t addrlen); |
첫 번째 인자는 위와 같이 클라이언트 소켓의 파일 디스크립터를 의미하고 두 번째 인자는 연결요청 할 서버의 주소정보를 담은 변수의 주소 값이다. 세 번째는 두 번째 인자에 전달된 주소의 변수 크기를 바이트 단위를 의미한다.
connect 함수가 호출되면 서버에 의해 연결요청이 접수가 되거나 오류가 발생해서 연결요청이 중단되는 현상이 발생한다. 여기서 말하는 연결요청의 접수는 accept 함수호출이 아니라 연결요청 대기 큐에 등록된 것이다.
대표사진 삭제
서버와 클라이언트의 함수 호출 관계