Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하 2001. 4. 13
목 차 서버의 역할 이해하기 listen(2) 함수 accept(2) 함수 TCP/IP 서버 작성 클라이언트 프로그램 수정
1. 서버의 역할 이해하기 서버의 단계 서버와 클라이언트의 차이 소켓 생성 소켓 주소 바인드 Listen 연결 연결 승인 클라이언트 프로그램과 통신 소켓 차단 서버와 클라이언트의 차이 소켓에서 서버주소를 바인드 연결을 위한 서버 listen 서버 연결 승인
서버의 역할 이해하기(계속) 클라이언트 Optional bind(2) socket(2) Step C1 C2 connect(2) communicate Read/write close(2) End C3 C4 C5 서 버 listen(2) accept(2) S1 S2 S3 S4 S5 S6 1. 소켓 생성 2. 소켓 주소 바인드 3. Listen 연결 4. 연결 승인 5. 메시지 전달(통신) 6. 소켓 차단
1. 서버의 역할 이해하기(계속) 클라이언트 만들어짐 socket 접속완료 종 료 서 버 이름을 받음 대기큐 구축 접속을 받음 (대기) connect OK 응답 bind listen accept
2. Listen(2) 함수 listen(2) 함수 #include <sys/socket.h> int listen(int s, int backlog); s:소켓 함수로 반환하는 지시자 backlog: 연결 큐의 길이 함수의 반환이 성공 → 0 실패 → -1(erron에 기록)
2. Listen(2) 함수(계속) 9 8 7 6 5 4 3 2 1 Linux kernel Process Client Client Connects Linux kernel 9 8 7 6 5 4 3 2 1 accept(2) Process Client Request listen(2)
2. Listen(2) 함수(계속) backlog 값 명세 초기 UNIX backlog 5 사용 Richard Stevens backlog 16 사용 현재 20 사용(5-10을 선호) backlog 클수록 Web Sever Application에 적합
3. accept(2) 함수 호출 accept(2) 함수 #include <sys/types.h> #include <sys/socket.h> Int accept(int s, struct sockaddr *addr, int *addrlen); S: 소켓 지시자 *addr: 클라이언트 소켓주소(sockaddr형 객체 주소를 갖는 포인터) *addrlen: 객체의 최대 크기
3. accept(2) 함수 호출(계속) 클라이언트 Optional Bind(2) socket(2) Step C1 C2 connect(2) communicate Read/write close(2) End C3 C4 C5 서 버 bind(2) listen(2) accept(2) S1 S2 S3 S4 S5 S6
4. TCP/IP 서버 작성 프로그램 분석 서버 네트워크 주소 결정 If (argc >= 2) { /* Addr on cmdline: */ srvr_addr = argv[1]; } else { /* Use default address: */ srvr_addr = “127.0.0.1”; }
4. TCP/IP 서버 작성 서버 포트 결정 소켓 생성 If (argc >= 3) { srvr_addr = argv[2]; s = socket(PF_INET,SOCK_STREAM,0); If (s == -1) bail(“socket( )”);
4. TCP/IP 서버 작성 서버 소켓 주소 생성 Memset(&adr_srvr,0,sizeof adr_srvr); Adr_srvr.sin_family = AF_Inet; Adr_srvr.sin_port = htons(atoi(srvr_port)); If ( strcmp(srvr_addr,”*”) !=0 ) { /* Normal Address */ adr_srvr.sin_addr.s_addr= inet_addr(srvr_addr); if ( adr_srvr.sin_addr.s_addr == INADDR_NODE ) bail(“bad address.”); } else { /* Wild Address */ adr_srvr.sin_addr.s_addr = INADDR_ANY; }
4. TCP/IP 서버 작성 소켓 주소 바인드 Listening 소켓 생성 Len_inet = sizeof adr_srvr; Z = bind(s,(struct sockaddr *)&adr_srvr,len_inet); If ( z == -1 ) bail(“bind(2)”); z = listen(s,10); If ( z == -1) bail(“listen(2)”);
4. TCP/IP 서버 작성 클라이언트 서비스 루프 시작(for;;) 클라이언트 연결 승인 Len_inet = sizeof adr_clnt; c = accept(s,(struct sockaddr *)&adr_clnt,len_inet); If ( c == -1 ) bail(“accept(2)”);
4. TCP/IP 서버 작성 데이트/시간 스트링 생성 데이트/시간 스트링 클라이언트에게 보내기 클라이언트 연결 닫기;close(c) time(&td); n = (int) strftime(dtbuf,sizeof dtbuf, “%A %b %d %H : %M : %S %Y\n”,localtime(&td)); z = write(c,dtbuf,n); If ( z == -1) bail(“write(2)”);
4. TCP/IP 서버 작성 출 력 $ make server gcc –c –D_GUN_SOURCE –Wall –Wreturn-type server.c gcc server.o –o server $ ./server & [1] 1049 $ telnet 127.0.0.1 9099 Trying 127.0.0.1… Connected to 127.0.0.1. Escape character is ‘^]’. Sunday Aug 22 21:18:24 1999 Connection closed by foreign host. $
4. TCP/IP 서버 작성 Wild Server Local loopback interface(출력) @pepper [1] 1078 $ telnet 127.0.0.1 9099 Trying 127.0.0.1… Connected to 127.0.0.1. Escape character is ‘^]’. Sunday aug 22 21:40:19 1999 Connection closed by foreign host.
4. TCP/IP 서버 작성 Wild Server 다른 IP 주소사용(출력) @pepper $ telnet 192.168.0.1 9099 Trying 192.168.0.1… Connected to 192.168.0.1. Escape character is ‘^]’. Sunday aug 22 21:40:27 1999 Connection closed by foreign host.
5. 클라이언트 프로그램 수정 프로그램 분석 임의의 두 포트 승인 If ( argc >= 3 ) srvr_port = argv[2];
5. 클라이언트 프로그램 수정 프로그램 분석 출 력 @pepper $ ./daytime 127.0.0.1 9099 Date & Time is: Sunday Aug 22 22:02:19 1999 $ ./daytime 192.168.0.1 9099 Date & Time is: Sunday Aug 22 22:02:30 1999
요 약