-
네트워크 프로그래밍과 소켓이해프로그래밍/TCP IP 2016. 12. 19. 01:55728x90반응형
네트워크 프로그래밍
네트워크 프로그래밍이란
소켓이라는 것을 기반으로 프로그래밍을 하기 때문에 소켓 프로그래밍이라고도 한다.
즉, 네트워크로 연결된 둘 이상의 컴퓨터 사이에서의 데이터 송수신 프로그램의 작성이기도 한다.
그렇다면 소켓은 무엇일까.
소켓이란, 네트워크(인터넷)의 연결 도구이다.
운영체제에 의해 제공이 되는 소프트웨어적인 장치이고
데이터 송수신에 대한 물리적, 소프트웨어적 세세한 내용을 신경쓰지않게된다.
소켓은 소켓의 연결요청(클라이언트 소켓)과 소켓의 연결요청(서버 소켓)의 수락으로 두가지로 나눌수있다.
서버 소켓(리스닝 소켓)
서버 소켓의 예를 우리가 흔히 사용하는 전화기를 들수있다.
A라는 전화기가 B라는 전화기에 전화를 하게되면
그 둘은 연결이되어 데이터를 주고받기 때문이다.
전화기는 각각 서로 직접적으로 연결된게 아니라
전화망을 통해서 연결되기때문에 전화망에 연결하는 도구가 되는것이다.
1. 소켓의 생성(socket)
TCP 소켓을 전화기에 비유하면 먼저 해야할 일은 소켓의 생성 즉, 전화기의 구입이다.
소켓생성의 함수는 이렇게 쓸 수 있다.
int socket(int domain, int type ,int protocol ) ;
- domain : 프로토콜 부류를 입력한다.
- type : 소켓과 함께 사용할 통신 형태를 입력한다.
- protocol : 사용할 프로토콜을 지정한다.
(TCP의 경우 IPPROTO_TCP를 사용하고 UDP의 경우 IPPROTO_UDP를 사용한다.
하지만 보통은 Raw소켓을 제외하고 0을 사용한다.)
이 함수를 쓰기위해선 #include <sys/socket.h> 가 필요하다.
2. 소켓의 주소 할당 및 (bind)
전화기를 구입하면 전화기에 전화번호를 할당 즉 개통을 해야하기에
이는 소켓의 주소를 할당하는것과 같다고 볼수있다.
소켓의 주소정보는 IP와 PORT번호로 구성이 되어있다.
소켓의 주소할당 함수는 이렇게 쓸 수 있다.
int bind(int sockfd, struct sockaddr *myaddr, socklen_t addrlen);
- sockfd : socket()함수에서 반환된 디스크립터 값을 넣는다.
- myaddr : 로컬 IP 및 포트에 대한 정보가 담긴 소켓주소에 대한 구조체를 넣는다.
- addrlen : myaddr에 넣은 구조체의 크기를 입력한다.
성공시 0을 반환하고 실패시 -1을 반환한다.
3. 소켓의 연결요청(listen)
소켓의 연결요청이 가능한 상태는 걸려오는 전화를 받을 수 있는 상태에 비유할 수 있다.
int listen(int sockfd, int backlog);
- sockfd : socket()함수에서 반환된 디스크립터 값을 넣는다.
- backlog : 접속대기 큐의 최대 연결 가능 수를 지정한다.
성공시 0을 반환하고
실패시 -1을 반환한다.
4. 소켓의 연결요청 수락(accept)
전화가 걸려올때 전화를 받는 역할이 연결요청의 수락으로 비유할 수 있다.
연결요청이 수락이 되어야 데이터의 송수신이 가능하다.
즉, 전화를 받은 상태에서 말하거나 들을수 있듯이 데이터의 송수신은 양방향으로 가능하다.
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
- sockfd : socket()함수에서 반환된 디스크립터 값을 넣는다.
- addr : 클라이언트의 호스트 IP 주소와 로컬 포트 정보등이 들어있는 구조체를 입력한다.
- addrlen : addr에 넣은 구조체의 크기를 입력한다.
연결요청이 있을 때에만 accept 함수가 반환을 한다.
이렇게 연결요청을 허용하는 소켓의 생성과정을 그림으로 볼수있다.
연결을 요청하는 프로그램은 클라이언트(client)라고 하고
연결요청을 허용하는 프로그램은 서버(Server)라고 한다.
서버는 클라이언트보다 먼저 실행되어야 한다.
이렇게 생성된 소켓을 서버 소켓 또는 리스닝 소켓이라고 한다.
요청하는 소켓
이번엔 소켓을 요청 하는 소켓을 소개하겠다.
클라이언트 소켓은 서버소켓과 달리 구현이 매우 간단하고
소켓의 생성과 연결의 요청으로 구분이 된다.
1. 소켓의 생성(socket)
클라이언트 소켓의 생성은 위에 서버 소켓의 생성과 같다.int socket(int domain, int type ,int protocol ) ;
- domain : 프로토콜 부류를 입력한다.
- type : 소켓과 함께 사용할 통신 형태를 입력한다.
- protocol : 사용할 프로토콜을 지정한다.
(TCP의 경우 IPPROTO_TCP를 사용하고 UDP의 경우 IPPROTO_UDP를 사용한다.
하지만 보통은 Raw소켓을 제외하고 0을 사용한다.)
2. 소켓의 연결요청(connect)
int connect(int sockfd, struct sockaddr *serv_addr, socklen_t addrlen);
- sockfd : socket()함수에서 반환된 디스크립터 값을 넣는다.
- serv_addr : 좁석할 서버의 주소와 포트에 관한 정보를 담고있는 구조체를 넣는다.
- addrlen : serv_addr에 넣은 구조체의 크기를 입력한다.
이렇게 해서 서버 소켓과 클라이언트 소켓을 소개했다.
728x90반응형