TCP서버의 기본적임 함수호출 순서
socket() -> bind() -> listen() -> accept() -> read() / write() -> close()
연결요청 대기 상태로의 진입
#include <sys/type.h>
int listen(int sock, int backlog); // 성공 시 생성된 소켓의 파일 디스크립터, 실패 시 -1 반환
// sock : 연결요청 대기상태에 두고자하는 소켓의 파일 디스크립터 전달, 이 함수의 인자로 전달된 디스크립터의 소켓이 서버 소켓(리스닝 소켓)이 된다.
// backlog 연결요청 대기 큐(Queue)의 크기정보 전달, 5가 전달되면 큐의 크기가 5가 되어 클라이언트의 연결요청을 5개까지 대기 시킬 수 있다.
연결요청도 일종의 데이터 전송이다. 따라서 연결 요청을 받아들이기 위해서도 하나의 소켓이 필요하다. 그리고 이 소켓을 가리켜 서버소켓 또는 리스닝 소켓이라 한다. listen 함수의 호출은 소켓을 리스닝 소켓이 되게 한다.
클라이언트의 연결요청 수락
#include <sys/socket.h>
int accept(int sock, struct sockaddr * add, socklen_t * addrlen); // 성공 시 생성된 소켓의 파일 디스크립터, 실패 시 -1 반환
// sock : 서버 소켓의 파일 디스크립터 전달.
// addr : 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달, 함수호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다.
// addrlen : 두번째 매개변수 addr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수호출이 완료되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.
연결요청 정보를 참조하여 클라이언트 소켓과의 통신으을 위한 별도의 소켓을 추가로 하나 더 생성한다. 그리고 이렇게 생성된 소켓을 대상으로 데이터의 송수신이 진행된다. 실제로 서버의 코드를 보면 실제로 소켓이 추가로 생성되는 것을 확인 할 수 있다.
TCP 클라이언트의 기본적인 함수호출 순서
#include <sys/socket.h>
int connect(int sock, const struct sockaddr * servaddr, socklen_t addrlen); // 성공시 생성된 소켓의 파일 디스크립터, 실패시 -1 반환
// sock 클라이언트 소켓의 파일 디스크립터 전달.
// servaddr 연결요청 한 클라이언트의 주소정보를 담을 변수의 주소 값 전달. 함수호출이 완료되면 인자로 전달된 주소의 변수에는 클라이언트의 주소정보가 채워진다.
// addrlen 두 번째 매개변수 servaddr에 전달된 주소의 변수 크기를 바이트 단위로 전달, 단, 크기정보를 변수에 저장한 다음에 변수의 주소 값을 전달한다. 그리고 함수 호출이 완료 되면 크기정보로 채워져 있던 변수에는 클라이언트의 주소정보 길이가 바이트 단위로 계산되어 채워진다.
클라이언트의 경우 소켓을 생성하고, 이 소켓을 대상으로 연결 요철을 위해서 connect 함수를 호출하는 것이 전부이다. 그리고 connect 함수를 호출할 때 연결할 서버의 주소 정보도 함께 전달한다.
'이전것 > 개발' 카테고리의 다른 글
vim 단축키 일람 (0) | 2016.12.02 |
---|---|
리눅스 - 파일 폴더 권한 바꾸기 (0) | 2016.12.02 |
ORA-12560: TNS:프로토콜 어댑터 오류 (0) | 2016.11.14 |
4.1.1. MERGE 문의 이해 및 활용 (0) | 2016.11.11 |
JSP -> (0) | 2016.11.09 |