인공지능실험실 석사 2학기 이희재 lhuijae@ai.hannam.ac.kr TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재 lhuijae@ai.hannam.ac.kr.

Slides:



Advertisements
Similar presentations
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
Advertisements

1 안드로이드 네트워킹 안드로이드 앱 프로그래밍 여 규리.
Network Lab. Byoung-Son, Choi
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
멀티 쓰레드 기반의 채팅 프로그램 이름 문성영 이름 김현진 학번 이름 장용하 이름 차희진 분석설계서.
인공지능실험실 석사 2학기 이희재 TCP/IP Socket Programming… 제 11장 프로세스간 통신 인공지능실험실 석사 2학기 이희재
Network Lab. Young-Chul Hwang
TCP Client/Server Program
Department of Computer Science and Engineering
Sockets Introduction and Protocol Setting
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
Linux Socket Programming - Introducing Sockets –
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
Department of Computer Science and Engineering
Multimedia & Mobile Communications Lab.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
제 12장 I/O멀티플렉싱(Multiplexing)
제 14장 Multicast & Broadcast
Department of Computer Engineering
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Department of Computer Engineering
양방향 파이프의 활용 양방향 통신 파이프는 기본적으로 단방향이므로 양방향 통신을 위해서는 파이프를 2개 생성한다.
12장 파이프.
네트워크 프로그래밍 Yang-Sae Moon Department of Computer Science
Department of Computer Engineering
고급 입출력 함수 School of Electronics and Information. Kyung Hee University.
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Chapter 06. UDP 서버/클라이언트.
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 9장 소켓의 다양한 옵션 인공지능실험실 박사 1학기 장성만
파일 기술자 복사 파일 기술자 복사 : dup(2) 파일 기술자 복사 : dup2(3)
파일 기술자 파일 기술자 현재 열려있는 파일을 구분하는 정수값 저수준 파일 입출력에서 열린 파일을 참조하는데 사용
4장 파일.
메시지 큐[5] – test1.c 메시지 제어: msgctl(2) #include <sys/msg.h>
Understanding of Socket and File I/O
프로젝트 발표 순서 12/7(수), 팀 별 15분 발표순서 PPT (팀 별 이름, 구현 내용, 결과-그래프 포함) 각 기법당
Department of Computer Science and Engineering
13장 고급 입출력 함수 박사 4학기 최 성자.
TCP/IP Socket Programming…
Socket Address Structure and Byte Ordering Functions
Socket Address Structure and Byte Ordering Functions
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Department of Computer Engineering
I/O&socket통신 POWERPOINT & GROUP STUDY 한재희 김상훈 최기람 황인준 이어진.
Sockets Introduction and Protocol Setting
TCP/IP 응용 프로그램에 적용 가능한 다양한 소켓 옵션을 이해하고 활용한다.
(분산 통신 실습) : 소켓(Sockets)
HTTP 프로토콜의 요청과 응답 동작을 이해한다. 서블릿 및 JSP 를 알아보고 역할을 이해한다.
24장. 파일 입출력.
네트워크 프로그래밍의 이해 School of Electronics and Information.
데이터베이스실험실 석사 2학기 조정희 TCP/IP Socket Programming… 제 18장 윈도우 기반 쓰레드 사용하기 데이터베이스실험실 석사 2학기 조정희
Department of Computer Engineering
Department of Computer Engineering
자바로 만든 채팅 프로그램 임경진 조주경 지도교수님 : 이광세 교수님.
Understanding of Socket and File I/O
제 16장 입력과 출력 스트림의 완벽 분리 TCP/IP Socket Programming… 데이터베이스 실험실
다중처리 기술 School of Electronics and Information. Kyung Hee University.
네트워크 환경 구축과 이미지 전송 호스트/타겟 통신 직렬 통신을 이용한 이미지 전송 수퍼 데몬 BOOTP 환경 구축
Chapter 04. TCP 서버/클라이언트.
Chapter 02. 윈도우 소켓 시작하기.
세션에 대해 알아보고 HttpSession 에 대해 이해한다 세션 관리에 사용되는 요소들을 살펴본다
MIDP 네트워크 프로그래밍 ps lab 김윤경.
구조체(struct)와 공용체(union)
인공지능실험실 박사 1학기 장성만 TCP/IP Socket Programming… 제 8장 도메인 이름과 인터네 주소 인공지능실험실 박사 1학기 장성만
Department of Computer Engineering
06. 디바이스의 등록과 해제 김진홍
Network Lab. Young-Chul Hwang
Completion Port기반의 채팅프로그램
Presentation transcript:

인공지능실험실 석사 2학기 이희재 lhuijae@ai.hannam.ac.kr TCP/IP Socket Programming… 제 7장 소켓 연결의 우아한 종료 인공지능실험실 석사 2학기 이희재 lhuijae@ai.hannam.ac.kr

목차 소켓 연결 종료의 문제점 우아한 소켓의 연결 종료 윈도우 기반으로 구현하기

소켓 연결 종료의 문제점 close 함수의 호출 연결의 완전 종료 데이터 송•수신을 할 수 없음 호스트 A가 마지막 패킷을 전송한 후 close 함수를 호출하면 호스트 B가 전송하는 마지막 응답 패킷을 받지 못 할 수도 있음 shutdown 함수(half close)를 사용함으로서 close 함수의 문제를 해결

소켓 연결 종료의 문제점 소켓과 스트림(Stream) 두 호스트가 소켓을 통해 연결된 상태를 스트림이 생성되었다고 표현 두 호스트가 소켓을 통하여 연결되면 입력 스트림과 출력 스트림이 생성됨 한 호스트의 입력은 다른 호스트의 출력 스트림에 연결 한 호스트의 출력은 다른 호스트의 입력 스트립에 연결 close 함수 호출 : 입•출력 스트림 모두 종료 shutdown 함수 호출 : 종료할 스크림 선택 가능

우아한 소켓의 연결 종료 스트림 half-close 기능의 함수 s : 종료하고자 하는 소켓의 파일 디스크립터 how : 종료 모드 SHUT_RD(입력), SHUT_WR(출력), SHUT_RDWR(입•출력) #include <sys/socket.h> int shutdown (int s, int how) 리턴값 : 성공 시 0, 실패 시 -1

우아한 소켓의 연결 종료 half-close 기능이 필요한 경우의 예제 파일 전송 프로그램 서버 클라이언트가 서버에 연결 서버는 클라이언트에게 파일을 전송한다. 클라이언트는 서버로부터 파일을 수신한 후 “Thank you”메시지 전송. 클라이언트는 EOF를 수신해야 “Thank you”메시지를 전송. close, shutdown 함수 모두 EOF를 전송하지만 서버는 shutdown 함수를 호출해야 클라이언트로부터 “Thank you”메시지를 받을 수 있다. 서버 클라이언트 연결요청 파일전송 EOF 전송 Thank you

우아한 소켓의 연결 종료 파일 전송 서버 … int serv_sd; int clnt_sd; int fd; char buf[BUFSIZE]; struct sockaddr_in serv_addr; struct sockaddr_in clnt_addr; int clnt_addr_size; int len; fd = open("file_server.c", O_RDONLY); //파일오픈 serv_sd = socket(PF_INET, SOCK_STREAM, 0); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(atoi(argv[1])); bind(serv_sd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); listen(serv_sd, 5); clnt_addr_size = sizeof(clnt_addr); clnt_sd = accept(serv_sd, (struct sockaddr *)&clnt_addr, &clnt_addr_size); // 파일의 내용을 클라이언트에게 전송 while ((len = read(fd, buf, BUFSIZE)) != 0) { write(clnt_sd, buf, len); } // 파일전송을 마치고 출력스트림을 닫는다. if (shutdown(clnt_sd, SHUT_WR) == -1) { error_handling("shutdown() error"); // 클라이언트로부터 “Thank you”메시지 수신 len = read(clnt_sd, buf, BUFSIZE); write(1, buf, len); // 표준 출력(모니터)으로 출력 close(fd); close(clnt_sd); …

우아한 소켓의 연결 종료 파일 수신 클라이언트 … int fd; int sd; char buf[BUFSIZE]; struct sockaddr_in serv_addr; int len; // 서버로부터 수신한 파일의 내용을 저장할 파일 fd = open("receive.dat", O_WRONLY | O_CREAT | O_TRUNC); sd = socket(PF_INET, SOCK_STREAM, 0); memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr(argv[1]); serv_addr.sin_port = htons(atoi(argv[2])); connect(sd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); while ((len = read(sd, buf, BUFSIZE)) != 0) { write(fd, buf, len); } // 파일수신이 끝나면 서버에 “Thank you”로 응답 write(sd, "Thank you\n", 10); close(fd); close(sd); …

우아한 소켓의 연결 종료 실행 결과

윈도우 기반으로 구현하기 윈도우 기반의 half-close 함수 s : 소켓핸들 how : 종료 모드 SD_RECEIVE(입력), SD_SEND(출력), SD_BOTH(입•출력) #include <winsock2.h> int shutdown (SOCKET s, int how) 리턴값 : 성공 시 0, 실패 시 SOCKET_ERROR

윈도우 기반으로 구현하기 윈도우 기반의 파일 전송 서버 … // 클라이언트에게 보내줄 파일 오픈 fp = fopen("file_server_win.c", "r"); if (fp == NULL) ErrorHandling("File open error!"); hServSock = socket(PF_INET, SOCK_STREAM, 0); hClntSock = accept(hServSock, (SOCKADDR *)&clntAddr, &clntAddrSize); // 클라이언트가 연결하면 파일의 내용을 읽어서 전송 while (1) { len = fread(buf, sizeof(char), BUFSIZE, fp); send(hClntSock, buf, len, 0); if (feof(fp)) break; } … // 파일 전송이 끝나면 소켓의 출력스트림을 닫음 if (shutdown(hClntSock, SD_SEND) == SOCKET_ERROR) ErrorHandling("shutdown() error!"); //클라이언트로부터 “Thank you” 메시지 수신 및 출력 len = recv(hClntSock, buf, BUFSIZE-1, 0); buf[len] = 0; fputs(buf, stdout); fclose(fp); closesocket(hClntSock); WSACleanup();

윈도우 기반으로 구현하기 윈도우 기반의 파일 수신 클라이언트 … // 서버로부터 수신한 데이터를 저장할 파일 fp = fopen("receive.dat", "w"); if (fp == NULL) ErrorHandling("File open error!"); hSocket = socket(PF_INET, SOCK_STREAM, 0); // 서버에 연결 if (connect(hSocket, (struct sockaddr *)&servAddr, sizeof(servAddr)) == SOCKET_ERROR) ErrorHandling("connect() error!"); … // 서버로부터 데이터를 수신하여 파일에 저장 while((len = recv(hSocket, buf, BUFSIZE, 0)) != 0) { fwrite(buf, sizeof(char), len, fp); } // 파일 수신이 끝나면 “Thank you” 메시지 전송 send(hSocket, "Thank you\n", 10, 0); fclose(fp); closesocket(hSocket); WSACleanup();

윈도우 기반으로 구현하기 실행결과

참고문헌 “UNIX Network Programming”, W.Richard Stevens “TCP/IP 소켓 프로그래밍”, 윤성우 저

Q & A