소켓 프로그래밍1. 네트워크 프로그래밍 개론소켓 (Socket)● 프로세스간 상호 양방향 통신 방식 - 각 호스트 간의 통신 시 구축되는 물리적인 연결 종단점 - 파일 처리 방식으로 다룰 수 있는 기술자 (Descriptor) 제공 - 각 종단점으로써 여러 속성을 보유 ● 네트워크를 통한 통신 가능 - TCP/IP 에 대한 인터페이스 제공 ● 소켓을 통한 프로세스 통신은 클라이언트/서버 모델(client/server model)에 기초 파일기술자와 소켓기술자소켓 참조 - open(2) 함수를 호출 하여 새로운 파일을 열었을 때, 리눅스 커널에서 파일 기술자를 반환 소켓의 유형● Stream Socket - 연결 지향형 (TCP 기반) - 소켓 간의 연결 후 데이터 전송 - 일상 생활의 전화 개념과 유사 ● Datagram Socket - 비 연결형 (UDP 기반) - 송수신 시 도착지 주소 필수 - 일상 생활의 편지 개념과 유사 ● Raw Socket - 저 수준 프로토콜 액세스 - ICMP, OSPF 등이 사용 - IP 계층 이용 소켓 연결 과정1. 서버가 명명된 소켓을 생성 2. 클라이언트가 명명되지 않은 소켓을 생성하고, 연결을 요청 3. 클라이언트가 연결됨. 서버는 원래 명명된 소켓을 유지 소켓의 함수● socket() : 사용하고자 하는 통신 프로토콜을 지정 - int socket(int domain, int type, int protocol); ● socketpair() : 소켓 연결의 한 쌍을 지정 - int socketpair(int domain, int type, int protocol, int sv[2]); ● close() : 소켓의 연결을 종료 - int close(int fd); ● shutdown() : 선택적 소켓의 연결을 종료 - int shutdown(int fd, int option); ● bind() : 소켓에 이름을 결합 - int bind(int sockfd, sockaddr * myaddr, int addrlen); ● listen() : 서버 프로세스가 통신할 연결기반 소켓 설정 - int listen (int sockfd, int size); ● accept() : 서버 프로세스에서 클라이언트 소켓과 연결을 설정 하기 위해 호출 - int accept (int sockfd, struct sockaddr *peer, int *addrlen); ● connect() : 클라이언트가 서버에 연결을 요청하기 위해 호출 - int connect (int socfd, struct sockaddr *servaddr, int addrlen); ● write () : 다른 소켓에 메시지 전송 - ssize_t write (int fd, const void *buf, size_t count); ● read() : 다른 소켓에서 메시지 수신 - ssize_t read (int fd, void *buf, size_t count); 예제Cook.c
Chef.c
2. 서버/클라이언트클라이언트/서버모델Server/Client = 단일 프로그램 Server는 Client의 연결 요청 대기 >> 정보 및 서비스 제공 Client는 Server에 정보 및 서비스의 제공을 요청하고 응답을 기다리는 호스트를 의미 서버의 유형서버 유형의 결정 - 클라이언트 접속 빈도, 얼마만큼의 클라이언트가 어느 정도의 빈도로 접속하는지에 따름 - 필요한 규모와 처리량, 주고 받는 데이터의 크기가 어느 정도이며 필요한 대역폭에 따름 - 데이터의 안정성 클라이언트 간 혹은 서버와 클라이언트 간의 데이터 신뢰도 요즘의 네트어ㅜ크 망은 설비가 잘 되어 있어 안정성에 대한 문제는 줄어 듬 단순 연결형 Client/Server1. 서버와 클라이언트의 소켓 생성 2. 서버는 BIND 작업 후 대기 큐 설정 (LISTEN) 3. 서버는 클라이언트의 접속 대기 (ACCEPT) 4. 클라이언트가 서버로 접속 시도 (CONNECT) 5. 접속이 완료 되면 서버와 클라이언트 간의 데이터 송수신 작업 6. 서버 종료 작업 7. 서버와 클라이언트 소켓 닫음 (CLOSE) 동서 처리 연결형 Client/Server1. 서버와 클라이언트의 통신 초기화 (SELECT 관련) 2. 서버와 클라이언트의 소켓 생성 3. 서버는 BIND 작업 후 대기 큐 설정 (LISTEN) 4. 서버는 클라이언트의 접속 대기 (ACCEPT) 5. 클라이언트가 서버로 접속 시도 (CONNECT) 6. 서버 측의 기술자에 이벤트가 발생 7. 접속 처리 후 클라이언트와 데이터 송수신 8. 서버 종료 작업 9. 서버와 클라이언트 소켓 닫음 (CLOSE) 단순 비연결형 Client/Server1. 서버와 클라이언트의 소켓 생성 2. 서버는 BIND 작업 후 대기 3. 서버와 클라이언트 간의 데이터 송수신 4. 서버는 단순히 클라이언트로 데이터 전송 5. 서버 종료 작업 6. 서버와 클라이언트의 소켓 닫음 양쪽 모두 상대방의 주소를 알고 있어야 지속적인 데이터 송수신이 가능함을 기억 동시 처리 비연결형 Client/Server1. 서버와 클라이언트의 소켓 생성 2. 서버는 BIND 작업 후 대기 3. 클라이언트가 서버로 접속 데이터 송신 4. 서버는 클라이언트의 접속시 마다 클라이언트 처리용 스레드 생성 5. 이 후의 클라이언트와의 통신은 각각의 스레드가 담당 6. 서버 종료 작업 7. 종료 시 스레드를 통한 클라이언트 종료 8. 서버와 클라이언트 소켓 닫음 (CLOSE) tcp_client.c
tcp_server.c
|