Network Lab. Young-Chul Hwang ychwang@netwk.hannam.ac.kr TCP/IP Socket Programming… 제 4장 TCP 기반 서버/클라이언트 1 Network Lab. Young-Chul Hwang ychwang@netwk.hannam.ac.kr
목차 TCP/UDP에 대한 이해 TCP 기반 서버의 구현 TCP 기반 클라이언트의 구현 TCP 서버/클라이언트 함수 호출 관계 Iterative 서버의 구현 에코(echo) 서버/클라이언트의 구현 윈도우 기반으로 구현하기
TCP/UDP에 대한 이해 프로토콜 스택 인터넷 기반의 효율적 데이터 전송 [그림 4-1] TCP/IP 프로토콜 스택
TCP/UDP에 대한 이해 LINK 계층 물리적인 영역 표준화 [그림 4-2] 인터넷의 연결 구조
TCP/UDP에 대한 이해 IP 계층 데이터의 전송(경로선택) [그림 4-3] IP 라우팅
TCP/UDP에 대한 이해 TCP/UDP 계층 데이터를 전송하는 방법을 정의 TCP와 IP의 관계 [그림 4-4] 전송 제어 프로토콜
TCP/UDP에 대한 이해 Application 계층 소켓을 이용한 프로그램의 구현을 의미 소켓 프로그래밍
TCP 기반 서버의 구현 서버에서의 기본적인 함수 호출 순서 [표 4-5] TCP 서버의 기본적인 함수 호출 순서
TCP 기반 서버의 구현 ‘연결 요청 대기 상태’로의 진입 listen 함수는 전달되는 인자의 소켓을 ‘서버소켓’이 되게 한다. listen 함수는 ‘연결 요청 대기 큐’를 생성한다. #include <sys/type.h> int listen(int s, int backlog) [ 리눅스의 listen 함수 ] #include <winsock2.h> int listen(SOCKET s, int backlog) [ 윈도우의 listen 함수 ]
TCP 기반 서버의 구현 ‘연결요청 대기상태’로의 진입 서버 소켓은 문지기 역할 [그림 4-6] 연결 요청 대기 상태
TCP 기반 서버의 구현 연결 요청 수락 하기 연결요청 대기 큐(queue)에 존재하는 클라이언트의 연결 요청 수락. #include <sys/type.h> #include <sys/socket.h> int accpet(int s, struct sockaddr * addr, int * addrlen); [ 리눅스의 accept 함수 ] #include <winsock2.h> SOCKET accept( SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen ); [ 윈도우의 accept 함수 ]
TCP 기반 서버의 구현 연결 요청 수락 하기 [그림 4-7] 연결 요청 수락 상태
TCP 기반 서버의 구현 Hello World 서버 프로그램 다시 보기 serv_sock=socket(PF_INET, SOCK_STREAM,0); 서버 소켓 생성 If (bind(serve_sock, (struct sockaddr*) &serv_addr, sizeof (serv_addr))==-1); 소켓에 주소 할당 If ( listen(serv_sock, 5) == -1) 연결 요청 대기 상태로 진입 clnt_sock = accept(serv_sock, (struct sockaddr*) &clnt_addr, *clnt_addr_size); 연결 요청 수락 write(clnt_sock, message, sizeof(message)); 데이터 전송 close (clnt_sock); 연결 종료
TCP 기반 클라이언트의 구현 클라이언트의 기본적인 함수 호출 순서 [그림 4-8] 클라이언트 함수 호출 순서
TCP 기반 클라이언트의 구현 클라이언트의 기본적인 함수 호출 순서 #include <sys/type.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); [ 리눅스의 연결 요청 함수 ] #include <winsock2.h> int connect( SOCKET s, const struct sockaddr FAR *name, int namelen ); [ 윈도우의 연결 요청 함수 ]
TCP 기반 클라이언트의 구현 Hello World 클라이언트 프로그램 다시 보기 sock=socket(PF_INET, SOCK_STREAM,0); 클라이언트 소켓 생성 If(connect (sock, (struct sockaddr*) &serv_addr, sizeof(serv_addr) == -1 ) 서버로 연결 요청 데이터 수신 strl_len=read(sock, message, sizeof(message) –1); close (sock) 연결 종료
TCP 서버/클라이언트 함수 호출 관계 [그림 4-9] TCP 클라이언트 서버 함수 호출 관계
Iterative 서버의 구현 반복해서 클라이언트의 요청을 처리
Iterative 서버의 구현 Iterative 서버의 코드 Template for( ; ; ){ clnt_addr_size=sizeof(clnt_addr); clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, &clnt_addr_size); if(clnt_sock==-1) { error_handling("accept() error"); break; } /* 데이터 전송 후 종결 */ write(clnt_sock, message, sizeof(message)); close(clnt_sock);
Iterative 서버의 구현 실행하기
에코(echo) 서버/클라이언트의 구현 에코 서버/클라이언트 기능 [그림 4-13] 에코 클라이언트 서버 모델
에코(echo) 서버/클라이언트의 구현 에코 서버의 구현
에코(echo) 서버/클라이언트의 구현 에코 클라이언트의 구현
윈도우즈 기반으로 구현하기 윈도우 기반 에코 서버
윈도우즈 기반으로 구현하기 윈도우 기반 에코 클라이언트
참고문헌 “데이터 통신과 네트워킹”, 이재광 외 2명, 교보문고 “TCP/IP 프로토콜”, 이재광외 5명, 미래컴 “Linux Socket Programming by Example”, Warren W. Gay, QUE '00
Q & A