TCP 서버에서 기본적인 함수의 호출 순서
socket 소켓 생성
bind 소켓 주소 할당
listen 연결 요청 대기상태
accept 연결 허용
read / write 데이터 송수신
close 연결종료
연결요청 대기 상태로 진입
int listen( int sock, int backlog )
성공시 0 실패시 -1 반환
sock : 연결 요청 대기상태에 두고자 하는 소켓의 파일 디스크립터 전달
이 함수의 인자로 전달된 디스크립터의 소켓이 서버 소켓(리스닝 소켓)이 된다.
backlog : 연결 요청 대기 큐(Queue) 의 크기 정보전달, 5가 전달될시 큐의 크기가
5가되어 클라이언트의 연결요청을 5 개 까지 대기시킬수 있다.
연결요청 대기상태 라는 것은 클라이언트가 연결 요청을 했을때 연결이 수락될때까지 연결 요청 자체를 대기시킬수 있다는 뜻이다.
Q : 저기요 저 연결좀 지금 하려고하는데요
A : 아 그러시군요 일단 여기서서 대기하세요 앞사람 끝나면 연결시켜드릴게요.
이 상태라는 뜻이다.
연결요청 대기 큐의 크기는 언제까지나 실험적 결과에 의존하여 결정되게 된다.
클라이언트의 연결요청 수락
listen 함수 호출 이후 클라이언트의 연결요청이 들어 왔다면, 들어온 순서대로 수락한다.
연결요청을 수락 = 데이터를 주고 받을 수 있는 상태 !
그럼 뭐가 필요한가? 물론 소켓이다.
그런데 만들어 놨던 서버 소켓은 문지기 역할을 하고있으니
클라이언트와의 데이터 송수신을 위해선 소켓이 하나 더 필요한 법이다.
하지만 직접 만들필요는 없다. 다음 함수의 호출로 자동으로 만들고 연결이 된다.
int accept ( int sock, struct sockaddr *addr , socklen_t *addrlen ) ;
성공시 소켓의 파일 디스크립터, 실패시 -1 반환
sock : 서버 소켓이 파일 디스크립터 전달
addr : 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소값 전달, 함수 호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소 정보가 채워진다.
addrlen : addr 에 전달된 주소의 변수크기를 바이트 단위로 전달.
결과적으로 말하자면 accept 함수는 ' 연결요청 대기 큐' 에서 대기중인 클라이언트의 연결요청을 수락해주는 함수이다.
호출성공시 내부적으로 데이터 입출력용 소켓을 생성하고 해당 소켓의 파일
디스크립터를 반환해준다.
중요한 것은 이 소켓은 자동으로 생성되어 연결요청한 클라이언트 소켓과 연결까지 해준다는 것이다.
TCP 클라이언트에서 기본적인 함수의 호출 순서
socket 소켓 생성
connect 연결 요청
read / write 데이터 송수신
close 연결종료
짧다
클라이언트의 연결요청
int connect ( int sock, struct sockaddr *servaddr, socklen_t addrlen ) ;
성공 시 0 , 실패 시 -1 반환
sock : 클라이언트 소켓의 파일 디스크립터 전달
servaddr : 연결요청 할 서버의 주소정보를 담은 변수의 주소 값 전달
addrlen : servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달
클라이언트가 connect 함수를 호출하면 다음준 두가지 중 한가지 상황이 되어야 함수가 반환된다. ( 함수 호출이 완료된다 )
- 서버에 의해 연결요청이 접수되었다.
- 네트워크 단절 등 오류상황으로인해 연결요청이 중단되었다.
자 여기서 잘 보자 connect = accept 가 아니다 !
고백한다고 무조건 받아지는게 아닌것처럼
이제그저 번호표를 뽑았을 뿐이다.
TCP 기반 서버, 클라이언트 함수 호출 관계
Q : 서버는 은행창구 클라이언트는 이용 고객 이군요
A : 그렇게 이해해도 문제가 없을듯 합니다.
Q : 번호표 뽑는게 Connect 받아주는건 Accept 구요
A : 그렇죠
Q : Connect 했다고 무조건 연결이 되는건 아니었네요
A : 고백했다고 무조건 사귀던가요
Q : .....