TCP Server/Client Department of Computer Engineering Kyung Hee University. Choong Seon Hong 1
TCP Server Program Procedure TCP Server socket() bind() 소켓생성 소켓번호와소켓주소의결합 listen() accept() read() 서비스처리, write() 연결대기 연결수락 클라이언트의요구처리 close() 2
TCP Server Program socket() 소켓의생성 socket(pf_inet, SOCK_STREAM,0) bind() int bind(int sockfd, struct sockaddr * myaddr, int addrlen); socket() 으로생성된소켓은그응용프로그램내에서유일한번호인소켓번호를배정받는다. 그러나이번호는응용프로그램만알고있는번호이므로이프로그램이컴퓨터외부와통신하려면이소켓번호와소켓주소 (IP 주소 + 포트번호 ) 를연결해두어야하며이를위해 bind() 가사용된다. 3
TCP Server Program bind() 호출시소켓번호와소켓주소의관계 응용프로그램 ( 서버 ) socket() bind() 연결 소켓번호 2. 자신의 IP 주소 3. 자신의포트번호 1. 프로토콜 TCP/IP 4. 상대방 IP 주소 5. 상대방포트번호 소켓인터페이스 네트워크 4
연결요청대기상태 ' 로의진입 listen 함수는전달되는인자의소켓을 서버소켓 이되게한다. listen 함수는 연결요청대기큐 를생성한다. #include <sys/type.h> int listen(int s, int backlog); s : 연결요청대기상태 에서클라이언트의연결요청을받아들이는역할을하게될소켓의파일디스크립터를인자로전달 서버소켓 backlog : 연결요청대기큐 (Queue) 의크기를나타냄. 인자로 5가들어오면, 큐의크기가 5가되어클라이언트의연결요청을 5개까지대기시킬수있게된다. 함수호출성공시에는 0, 실패시에는 -1이리턴 5
서버의역할과연결요청대기상태 Server socket is kind of a gatekeeper. Server 대기실 서버소켓 서버로의연결요청 data client 두번째인자 첫번째인자 6
연결요청수락하기 연결요청대기큐 (queue) 에존재하는클라이언트의연결요청수락 #include <sys/type.h> #include <sys/socket.h> int accept(int s, struct sockaddr * addr, int * addrlen); s : 서버소켓의파일디스크립터를인자로전달 addr : 연결요청을수락할클라이언트의주소정보를저장할변수의포인터. 함수호출이성공하면 addr이가리키는변수에는클라이언트의주소정보로채워지게됨. addrlen : 함수호출시인자로전달된 addr 포인터가가리키는구조체의크기를저장하고있는변수의포인터를넘겨줌. 서버는 *addr 를통해클라이언트의 IP 주소를알수있음. 성공시소켓의새로생성된파일디스크립터를, 실패시 -1 리턴 7
TCP Server Program accept() 호출시얻는소켓주소정보와새로운소켓 응용프로그램 (Client) socket() bind() listen() accept() 소켓번호 새로운소켓번호 소켓인터페이스 2. 자신의 IP 주소 3. 자신의포트번호 1. 프로토콜 TCP/IP 4. 상대방 IP 주소 5. 상대방포트번호 네트워크 8
연결요청수락상태 연결요청 연결요청대기큐 1 2 3 서버소켓 Client1 Client2 Client3 Accept 함수호출연결요청수락 새로운소켓 연결완료! 데이터송수신진행 accept() 함수의수행이성공하면접속된클라이언트와의통신에사용할새로운소켓이만들어지고이소켓번호가리턴, 실패시에는 -1을리턴서버는이클라이언트와통신하기위하여 accept() 가리턴하여새로만들어진소켓번호를사용 9
Remind of Hello World! Server 프로그램예제 helloworld_server.c 실행하기포트번호는 123+ 각자아이디 Ex) ID : ip25 = 12325 10
클라이언트의기본적인함수호출순서 Procedure TCP Client socket() 소켓개설 sockaddr_in 구성 서버의 IP 주소와포트번호지정 connect() 서버로연결요구 read(), write() 데이터송수신 close() 11
연결요청함수 소켓과목적지주소에대한정보를마련한후연결요청을시도한다. #include <sys/type.h> int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 서버에연결요청 sockfd : 미리생성해놓은소켓의파일디스크립터 serv_addr : 연결요청을보낼서버의주소정보를지닌구조체변수의포인터 addrlen : serv_addr 포인터가가리키는주소정보구조체변수의크기 12
TCP Client Program connect() 호출시소켓번호와소켓주소의관계 응용프로그램 (Client) socket() connect() 소켓번호 소켓인터페이스 2. 자신의 IP 주소 3. 자신의포트번호 1. 프로토콜 4. 상대방 IP 주소 5. 상대방포트번호 TCP/IP 네트워크 13
Remind of Hello World! Client 프로그램예제 helloworld_client.c 실행하기포트번호는 123+ 각자아이디 Ex) ID : ip25 = 12325 14
소켓사용절차 TCP ( 연결형 ) 소켓프로그래밍절차 서버클라이언트 socket() socket() bind() listen() 연결요청 connect() accept() write() read() close() 데이터송수신 종료 read() write() close() 15
Iterative 서버의구현 Iterative TCP Server socket() bind() 소켓개설 소켓번호와소켓주소의결합 listen() accept() read() 서비스처리, write() 연결을기다림 연결수락 클라이언트의요구를처리한후결과 N Finished? Y closed() 16
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); } 17
예제확인 helloworld_server2.c, helloworld_client.c 18
에코 (echo) 서버 / 클라이언트의구현 에코서버 / 클라이언트의기능 Server Client 버퍼 ( 배열 ) Hello! Hello! message 19
예제확인 프로그램예제 echo_server.c, echo_client.c 실행결과 20
TCP 기반의데이터전송특징 한번의데이터전송함수호출 (write, send) 이늘하나의패킷을형성하는것은아니다. Server Client 버퍼 ( 배열 ) D ABCD C A B A, B 먼저도착 21
다시구현하는 TCP 기반의에코클라이언트 프로그램예제 echo_client2.c 22
경계가없는 TCP 기반의데이터전송 데이터송수신함수의호출횟수는큰의미를지니지않는다. Server Client MSG 1 두번에걸쳐메시지전송 한번에메시지수신후한번에메시지전송 MSG 2 MSG 1 + MSG 2 네번에걸쳐서메시지수신 23
예제확인 프로그램예제 bnd_server.c, bnd_client.c 실행결과 24
실습과제 #1 daytime_tcp_server.c, daytime_tcp_client.c Daytime service를제공하는서버프로그램과클라이언트프로그램을작성하시오.(tcp 이용 ) Hint #include<stdio.h> #include<stdlib.h> #include<time.h> Int main(int argc, char *argv[ ]) { time_t tim; tim =time(null); printf( 현재시각은 %s, ctime(&tim)); return 0; } 25
실습과제 #2 hostname_tcp_server.c, hostname_tcp_client.c 클라이언트가도메인네임을서버로전달해주면그서버의 hostname을알려주는프로그램을작성하시오 (TCP 이용 ) Hint struct hostent, gethostbyname() 26