6장 비연결형 지향 프로토콜 Database Lab 강 우 석.

Slides:



Advertisements
Similar presentations
Network Programming:
Advertisements

Python Socket/HTTP overmania. 목표  소켓을 이용하여 기본적인 서버 - 클라이언트 모델을 구현할 수 있다.  간단한 웹서버를 소켓을 이용하여 작성할 수 있다.
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
Java Socket 통신 이개혁 정대준.
Understanding of Socket and File I/O
TCP/IP Network Experimental Programming [IPv6에 의한 통신 실험]
13장 소켓.
Chapter 06. UDP 서버/클라이언트.
TCP/IP Socket Cover Slide 조태문.
TCP Client/Server Program
TCP/IP 소켓 프로그래밍 - C 버전 중에서
Department of Computer Engineering
소켓 모델 주소 지정 in_addr_t inet_addr(const char *ip_address) 연결 지향 모델 (TCP)
4장. 소켓 유형과 프로토콜 Network Lab. 이 원 구 1.
PHP 웹 프로그래밍 (PHP Web Programming) 네트워크 프로그래밍 문양세 강원대학교 IT대학 컴퓨터과학전공.
TCP/IP Socket Cover Slide 조태문.
Department of Computer Engineering
제 18 장 TCP/IP 연결 확립과 종료 정보통신연구실.
16장.네트워크 보안 프로그래밍 소프트웨어공학연구실 최 상 수
TCP Client/Server Program
Network Lab. Seoung Hyeon, Lee
얇지만 얇지 않은 TCP/IP 소켓 프로그래밍 C 2판
Department of Computer Science and Engineering
컴퓨터 네트워크 PART 03 프로그래밍 (chapter 01 Socket 프로그래밍) 임효택
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
Internet Address Conversion Functions
11 소켓 프로그래밍 기초.
인터넷 주소 변환 School of Electronics and Information. Kyung Hee University.
14장 소켓.
18장 Practical Network Project
제 12장 I/O멀티플렉싱(Multiplexing)
Using Standard I/O on Sockets
Department of Computer Engineering
한남대학교 컴퓨터공학과 컴퓨터 네트워크 실험실
Department of Computer Engineering
(Web Programming & Practice)
Socket Address Structure and Byte Ordering Functions
Department of Computer Engineering
Term Project Team Member
Socket Address Structure and Byte Ordering Functions
Homework 6… 12월 2일(금) 11:59pm까지 자신의 이름과 학번을 출력해 주는 유닉스/리눅스 네트워크 소켓 서버 프로그램 과 클라이언트 프로그램 을 작성해 보세요 참고 (실습1) Hello 프로그램 helloserver.c helloclient.c 컴파일.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하
Department of Computer Engineering
Chapter 06. UDP 서버/클라이언트.
Advanced Socket Programming
Department of Computer Engineering
13장 고급 입출력 함수 박사 4학기 최 성자.
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
7장. UDP 서버-클라이언트 UDP 서버-클라이언트의 기본 구조와 동작 원리를 이해한다.
Department of Computer Engineering
서버 실습 기말과제 게임소프트웨어 b 이도하 Date :2014/12/11(목)
School of Electronics and Information. Kyung Hee University.
네트워크 프로그래밍의 이해 School of Electronics and Information.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Chapter 16 Socket Interface.
Department of Computer Engineering
Department of Computer Engineering
윤성우의 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 열혈강의 TCP/IP 소켓 프로그래밍 개정판
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
Department of Computer Engineering
Chapter 04. TCP 서버/클라이언트.
Department of Computer Engineering
argc, argv 의 사용방법 #include <stdio.h>
Chapter 03. 소켓 주소 구조체 다루기.
소켓의 생성과 프로토콜의 설정 School of Electronics and Information.
Department of Computer Engineering
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
Department of Computer Engineering
Presentation transcript:

6장 비연결형 지향 프로토콜 Database Lab 강 우 석

목 차 통신 방법 데이터그램의 입력/출력 실행 UDP 데이터그램 서버 작성 UDP 데이터그램 클라이언트 작성 데이터그램 클라이언트와 서버 테스트

통신 방법 목차 통신 방법 비연결형의 장점 비연결형의 단점

통신 방법 [계속] 통신 방법 연결형 방법 비연결형 방법 Client Server Client Server 연결 설정 요구 연결 설정 승인 데이터 전송 Client Server Client Server 데이터 전송

통신 방법 [계속] Client Server 연결형 Socket() Socket() bind() connect() 연결요청 Listen() accept() recv() send() 데이터 송수신 send() recv() 종료 close()

통신 방법 [계속] Client Server 비연결형 Socket() Socket() bind() sendto() recvfrom() 데이터 송수신 recvfrom() sendto() 종료 close()

통신 방법 [계속] 장점 간단함 유연함 능률적 신속함 브로드캐스트

통신 방법 [계속] 단점 신뢰성이 떨어짐 다수의 데이터그램의 연속성이 없음 메시지 크기 제한

데이터그램의 입력/출력 실행 목차 sendto(2) 함수 소개 recvfrom(2) 함수 소개

데이터그램의 입력/출력 실행 [계속] 관련 함수 소켓의 입출력 부분 데이터그램 전송시 Read(2) Write(2) Sendto() Recvfrom()

데이터그램의 입력/출력 실행 [계속] Sendto() 역할 구조 데이터그램 기록 수신자의 목적 주소 명시 #include <sys/types.h> #include <sys/socket.h> Int sendto( int s, Const void *msg, Int len, Unsigned flags, Const struct sockaddr *to, Int tolen);

데이터그램의 입력/출력 실행 [계속] flag 인수 값 Flag 16 진수 의 미 0x0000 MSG_OOB 0x0001 의 미 0x0000 정상-특정 옵션 없음 MSG_OOB 0x0001 밴드 외의 데이터 처리 MSG_DONTROUTE 0x0004 라우팅 무시[직접 인터페이스 사용] MSG_DONTWAIT 0x0040 블록 아님[ 기록 대기 ] MSG_NOSIGNAL 0x4000 다른 종점이 접속해지 되었을때 sigpipe 상승

데이터그램의 입력/출력 실행 [계속] recvfrom() 역할 구조 Sendto()와 쌍을 이룸 송신자의 주소 획득 #include <sys/types.h> #include <sys/socket.h> Int recvfrom( int s, void *buf, Int len, Unsigned flags, struct sockaddr *from, Int *fromlen);

데이터그램의 입력/출력 실행 [계속] flag 인수 값 Flag 16 진수 의 미 0x0000 MSG_OOB 0x0001 의 미 0x0000 정상 MSG_OOB 0x0001 영역 외의 데이터 처리 MSG_PEEK 0x0002 커널 수신큐로부터 삭제없이 읽음 MSG_WAITALL 0x0100 요구를 만족할 때까지 연산 블록 요구 MSG_ERRQUEUE 0x2000 에러큐로부터 패킷 수신 MSG_NOSIGNAL 0x4000 다른 종점이 연결 해지될때 스트림 소켓을 위한 SIGPIPE 상승 억제

UDP 데이터그램 서버 작성 예제 6.1[dgramsrvr.c] 초기화 소켓 생성/주소 생성 주소 결합 대 기 수신/응답 종료 Socket() 주소 결합 Bind() for 대 기 수신/응답 종료

UDP 데이터그램 서버 작성[계속] 초기화 Int main(int argc,char **argv) { int z; char *srvr_addr = NULL; struct sockaddr_in adr_inet;/* AF_INET */ struct sockaddr_in adr_clnt;/* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; /* Recv buffer */ char dtfmt[512]; /* Date/Time Result */ time_t td; /* Current Time and Date */ 0 struct tm tm; /* Date time values */ if ( argc >= 2 ) { /* Addr on cmdline: */ srvr_addr = argv[1]; } else { /* Use default address: */ srvr_addr = "127.0.0.23"; }

UDP 데이터그램 서버 작성[계속] 소켓 생성 주소 생성 s = socket(AF_INET,SOCK_DGRAM,0); if ( s == -1 ) bail("socket()"); memset(&adr_inet,0,sizeof adr_inet); adr_inet.sin_family = AF_INET; adr_inet.sin_port = htons(9090); adr_inet.sin_addr.s_addr = inet_addr(srvr_addr); if ( adr_inet.sin_addr.s_addr == INADDR_NONE ) bail("bad address."); len_inet = sizeof adr_inet;

UDP 데이터그램 서버 작성[계속] 주소 결합 대기 z = bind(s, (struct sockaddr *)&adr_inet, len_inet); if ( z == -1 ) bail("bind()"); for (;;) { } close(s); return 0;

UDP 데이터그램 서버 작성[계속] 수신 len_inet = sizeof adr_clnt; z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max recv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr_clnt,/* Addr */ &len_inet); /* Addr len, in & out */ if ( z < 0 ) bail("recvfrom(2)");

UDP 데이터그램 서버 작성[계속] 응답 요청 처리 dgram[z] = 0; /* null terminate */ if ( !strcasecmp(dgram,"QUIT") ) break; /* Quit server */ time(&td); /* Get current time & date */ tm = *localtime(&td); strftime(dtfmt, /* Formatted result */ sizeof dtfmt, /* Max result size */ dgram, /* Input date/time format */ &tm);

UDP 데이터그램 서버 작성[계속] 메시지 송신 z = sendto(s, /* Socket to send result */ dtfmt, /* The datagram result to snd */ strlen(dtfmt), /* The datagram lngth */ 0, /* Flags: no options */ (struct sockaddr *)&adr_clnt, /* addr */ len_inet); /* Client address length */ if ( z < 0 ) bail("sendto(2)");

UDP 데이터그램 서버 작성[계속] 서버 프로그램 실행 방법 백그라운드로 실행 다른 IP로 실행 $./dgramsrvr & [1] 4339 $./dgramsrvr 192.168.0.1 & [1] 4341

UDP 데이터그램 클라이언트 작성 예제 6.2[dgramclnt .c] 초기화 주소 생성/소켓 생성 메시지 전송 사용자 입력 주소 생성/소켓 생성 사용자 입력 메시지 전송 결과 출력 메시지 수신 fputs Socket() sendto recvfrom

UDP 데이터그램 클라이언트 작성[계속] 초기화 Int main(int argc,char **argv) { int z; int x; char *srvr_addr = NULL; struct sockaddr_in adr_srvr; /* AF_INET */ struct sockaddr_in adr; /* AF_INET */ int len_inet; /* length */ int s; /* Socket */ char dgram[512]; if ( argc >= 2 ) { /* Addr on cmdline: */ srvr_addr = argv[1]; } else { /* Use default address: */ srvr_addr = "127.0.0.23";

UDP 데이터그램 클라이언트 작성[계속] 주소 생성 소켓 생성 memset(&adr_srvr,0,sizeof adr_srvr); adr_srvr.sin_family = AF_INET; adr_srvr.sin_port = htons(9090); adr_srvr.sin_addr.s_addr = inet_addr(srvr_addr); if ( adr_srvr.sin_addr.s_addr == INADDR_NONE ) bail("bad address."); len_inet = sizeof adr_srvr; s = socket(AF_INET,SOCK_DGRAM,0); if ( s == -1 ) bail("socket()");

UDP 데이터그램 클라이언트 작성[계속] 사용자 입력 메시지 전송 fputs("\nEnter format string: ",stdout); if ( !fgets(dgram,sizeof dgram,stdin) ) break; /* EOF */ z = strlen(dgram); if ( z > 0 && dgram[--z] == '\n' ) dgram[z] = 0; z = sendto(s, /* Socket to send result */ dgram, /* The datagram result to snd */ strlen(dgram), /* The datagram lngth */ 0, /* Flags: no options */ (struct sockaddr *)&adr_srvr,/* addr */ len_inet); /* Server address length */ if ( z < 0 ) bail("sendto(2)"); if ( !strcasecmp(dgram,"QUIT") ) break;

UDP 데이터그램 클라이언트 작성[계속] 메시지 수신 결과 출력 x = sizeof adr; z = recvfrom(s, /* Socket */ dgram, /* Receiving buffer */ sizeof dgram, /* Max recv buf size */ 0, /* Flags: no options */ (struct sockaddr *)&adr, /* Addr */ &x); /* Addr len, in & out */ if ( z < 0 ) bail("recvfrom(2)"); dgram[z] = 0; printf("Result from %s port %u :\n\t'%s'\n", inet_ntoa(adr.sin_addr), (unsigned)ntohs(adr.sin_port), dgram);

데이터그램 클라이언트와 서버 테스트 목차 서버 없이 테스트 다른 IP 주소를 통한 테스트 클라이언트 프로그램에서 bind(2) 함수 생략 Wild 주소의 응답

데이터그램 클라이언트와 서버 테스트 테스트 방법 서버 프로그램 시작 클라이언트 프로그램 시작 클라이언트 프로그램에 입력값 입력 클라이언트 프로그램에 “Ctrl+D”, “QUIT” 입력

데이터그램 클라이언트와 서버 테스트 서버 실행 방법 클라이언트 실행 방법 $./dgramsrvr & [1] 4405 $./dgramclnt Enter format string :

데이터그램 클라이언트와 서버 테스트 서버 없는 테스트 $./dgramclnt Enter format string : %D Connection refused : recvfrom(2) $

데이터그램 클라이언트와 서버 테스트 다른 IP 주소로 테스트 서버 실행 [ 192.168.0.1 ] 클라이언트 실행 [ 192.168.0.2 ] $./dgramsrvr 192.168.0.1 & [1] 4416 $./dgramclnt 192.168.0.1 Enter format string : %D Result from 192.168.0.1 port 9090: ’08/13/99’ Enter format string : QUIT $

데이터그램 클라이언트와 서버 테스트 Wild 주소의 적용 printf(3) 구문의 추가 Prinft(“Client from %s port %u;\n, inet_ntoa(adr_clnt.sin_addr), (unsigned)ntohs(adr_clnt.sin_port));

요약