1.

Slides:



Advertisements
Similar presentations
03 변수와 자료형 세종대학교 최옥경 교수 참고 : 한빛미디어 뇌를 자극하는 C, INFINITY Perfect C.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
TCP 서버/클라이언트 동작 원리 - (1) TCP 서버/클라이언트 예 웹 서버 웹 클라이언트 웹 클라이언트
데이터의 표현과 연산 (1) (Chapter 3)
제 3 장 변수와 자료형.
제3장 C 프로그래밍 환경.
2014 ITA 8월 강의 C Programming -1주차- C언어 기초 정대진 ( )
13장 소켓.
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
Chapter 10– 표준 함수(1) Outline 10.1 스트림과 파일 10.2 입출력 표준 함수
제 8 장  파서 생성기 YACC 사용하기.
제1장 코드와라이브러리 Page 1 ~ 30 ■■■■■ ■ ■.
제 18 장 TCP/IP 연결 확립과 종료 정보통신연구실.
쉽게 풀어쓴 C언어 Express 제18장 입출력과 라이브러리 함수 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
제9장 C 프로그래밍 환경 창병모
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
Network Lab. Seoung Hyeon, Lee
버퍼 오버플로우에 대한 대책과 발전된 공격 안전한 함수 사용 버퍼 오버플로우에 취약한 함수 사용하지 않기
호스트이름과 네트워크이름 찾기 (Hostname and Network Name Lookups)
6장 비연결형 지향 프로토콜 Database Lab 강 우 석.
14장 소켓.
Chapter 9 – 구조형과 리스트 처리 Outline 9.1 자신 참조 구조형 9.2 선형 연결 리스트 9.3 리스트 연산
FND (Flexible Numeric Display)
Using Standard I/O on Sockets
쉽게 풀어쓴 C언어 Express 제17장 동적 메모리와 연결 리스트 C Express.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express.
동적메모리와 연결리스트 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 02. 프로그램의 기본구성.
fork로 생성한 자식 프로세스에서 exec 함수군을 호출
Internet Protocol and Programming
Department of Computer Engineering
링크 파일 생성[1] 링크 하드링크 생성 : link(2) 이미 있는 파일이나 디렉토리에 접근할 수 있는 새로운 이름
3 파일과 디렉토리.
Linux/UNIX Programming APUE (Files & Directories)
1장. 프로그래밍 언어, C 프로그래밍.
Chapter 8 연결형 프로토콜 서버 발표자 : SE Lab 황 성 하
Department of Computer Engineering
제 3 장 상수와 변수
1주차: 프로그래밍언어란 무엇인가? C 언어란? C 프로그래밍을 위한 준비
10장 C 표준 파일 입출력 子曰 學而時習(실습?)之 不亦悅乎.
4장 제어문 선택문: if 문, if – else 문, switch 문
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
School of Electronics and Information. Kyung Hee University.
Internet Protocol and Programming
제어문 & 반복문 C스터디 2주차.
3 파일과 디렉토리.
4장 - PHP의 표현식과 흐름 제어-.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
Stepper Motor 디바이스 드라이버
4장 자료형.
Chapter 05. 입출력 함수.
실습과제 1(조건문, ) 표준입력으로 수축기 혈압을 입력 받아 그에 따른 적당한 표현을 화면에 출력하는 프로그램을 if-else 문을 이용하여 작성.
Fflush 사용이유 및 방법 [이유] 키보드에서 입력된 내용은 입력버퍼에 저장되었다가 Enter 키가 들어오면 프로그램으로 전달됨 이 때 입력버퍼에 있는 Enter 키도 프로그램으로 전달됨 그러므로 아래와 같은 프로그램에서 문자 하나를 입력해도 Enter키도 입력된 것으로.
Internet 유선 랜카드 A 회사 네트워크 장비 (인터넷 공유 기능 활성화)
GDB - GNU Debugger 김진용.
Internet Protocol and Programming
실습과제 1번 생성된 파일 basic.txt를 프로젝트 폴더에서 메모장으로 열고 내용을 확인
어서와 C언어는 처음이지 제16장.
개정판 누구나 즐기는 C언어 콘서트 제10장 문자열 출처: pixabay.
C.
printf("Global Korea\n");
C 프로그래밍은 매우 도전적인 작업이다. 도전의 이면에 철저한 준비와 체계적인 노력
3장 파일 다루기 한빛미디어(주).
개정판 누구나 즐기는 C언어 콘서트 제12장 파일 입출력 출처: pixabay.
3b장 구조체와 열거형 구조체의 정의 구조체 변수의 선언 구조체 초기화 및 사용 구조체 재정의 포인터를 이용해서 구조체 사용
Department of Computer Engineering
배열.
Presentation transcript:

1

2 hello, world 출력 소켓 프로그램의 기능 확장 ① 연결요청 : 서버 프로그램에 연결 요청 (클라이언트 -> 서버) ② print 요청 : 문자열 ‘print’ 전송 (클라이언트 -> 서버) ③ 문자열 전송 : 문자열 ‘hello, world’ 전송 (서버 -> 클라이언트) ④ 화면 출력 : 문자열 ‘hello, world’ 화면 출력 2

3 ☎ ☎ ☎ ☎ 연결요청 “print” ‘p’ ‘r’ ‘i’ ‘n’ ‘t’ \r \n internet shell Hello,world 출력 확장 서버 $ telnet 192.1.2.3 9000 print[enter] 소켓 2156 IP 주소 IP 주소 9000 소켓 internet ☎ ☎ “hello, world” 연결요청 “print” ‘p’ ‘r’ ‘i’ ‘n’ ‘t’ \0 Hello,world 출력 확장 서버 print Hello, world 출력 확장 클라이언트 소켓 2354 IP 주소 IP 주소 9000 소켓 ☎ ☎ internet “hello, world” 3

4 hello, world 출력 소켓 프로그램 확장 / 서버 server rBuffer ‘p’ ⑦ temp 37 while(1) { 38 len = sizeof(c_addr); 39 c_socket = accept(s_socket, (struct sockaddr *) &c_addr, &len); 40 41 length = 0; 42 temp = rBuffer; 43 while((n = read(c_socket, temp, 1)) > 0) { 44 if(*temp == '\r') continue; 45 if(*temp == '\n') break; 46 if(*temp == '\0') break; 47 48 if(length == BUFSIZ) break; 49 temp++; length++; 50 } 51 52 rBuffer[length] = '\0'; 53 54 if(!strcmp(rBuffer, "print") ) { 55 n = strlen(buffer); 56 write(c_socket, buffer, n); 57 } 58 close(c_socket); 59 } 60 close(s_socket); 61 } rBuffer ‘p’ ⑦ temp read(c_socket, temp, 1) client telnet “print” ‘p’ ‘r’ ‘i’ ‘n’ ‘t’ \r \n 응용 프로그램 “print” ‘p’ ‘r’ ‘i’ ‘n’ ‘t’ \0 ① 소켓을 생성 ⑥ 클라이언트 연결 요청 수신 ② 연결 요청을 수신할 주소 설정 ⑦ 클라이언트 요청 서비스 제공 ③ 소켓을 포트에 연결 ⑧ 클라이언트와 연결 종료 ④ 커널(kernel)에 개통 요청 ⑨ 서버 종료 4 ⑤ 무한반복

5 ☎ ☎ 연결요청 “print” ‘p’ ‘r’ ‘i’ ‘n’ ‘t’ \r \n internet “hello, world” shell Hello,world 출력 확장 서버 $ telnet 192.1.2.3 9000 print[enter] 소켓 2156 IP 주소 IP 주소 9000 소켓 ☎ internet ☎ “hello, world” 실행 실행 터미널-1 / 서버측 실행 $ gcc -o hello_ext_server hello_ext_server.c $ hello_ext_server ■ 실행 터미널-2 / 클라이언트측 실행 $ telnet 127.0.0.1 9000 Trying 127.0.0.1... Connected to it (127.0.0.1). Escape character is '^]'. print hello, worldConnection closed by foreign host. $ 5

6 실행 실행 터미널-2 / 클라이언트측 실행 $ telnet 127.0.0.1 9000 Trying 127.0.0.1... Connected to it (127.0.0.1). Escape character is '^]'. print hello, worldConnection closed by foreign host. $ 실행 터미널-1 / 서버측 실행 전달되는 바이트 수: 7바이트 1번째 바이트 = 0x70 ('p') 2번째 바이트 = 0x72 ('r') 3번째 바이트 = 0x69 ('i') 4번째 바이트 = 0x6e ('n') 5번째 바이트 = 0x74 ('t') 6번째 바이트 = 0x0d (CR) 7번째 바이트 = 0x0a (LF) 6

7 hello, world 출력 소켓 프로그램 확장 / 클라이언트 ④ ④ 서비스 요청 및 처리 ① 소켓을 생성 28 if(connect(c_socket, (struct sockaddr *) &c_addr, sizeof(c_addr)) == -1) { 29 printf("Can not connect\n"); 30 close(c_socket); 31 return -1; 32 } 33 34 scanf("%s", buffer); 35 buffer[strlen(buffer)] = '\0'; 36 write(c_socket, buffer, strlen(buffer)+1); 37 38 if((n = read(c_socket, rcvBuffer, sizeof(rcvBuffer))) < 0) { 39 return (-1); 40 } 41 42 rcvBuffer[n] = '\0'; 43 printf("received Data : %s\n", rcvBuffer); 44 45 close(c_socket); 46 } ④ ① 소켓을 생성 ④ 서비스 요청 및 처리 ② 연결할 서버의 주소와 포트를 결정 ⑤ 소켓 연결을 종료 ③ 소켓을 서버에 연결 ④ 커널(kernel)에 개통 요청 7

8 ☎ ☎ 연결요청 “print” ‘p’ ‘r’ ‘i’ ‘n’ ‘t’ \0 “print” internet Hello,world 출력 확장 서버 “print” Hello, world 출력 확장 클라이언트 소켓 2354 IP 주소 IP 주소 9000 소켓 internet ☎ ☎ “hello, world” “hello, world” ‘h’ ‘e’ ‘l’ ‘l’ ‘o’ ‘,’ ‘w’ ‘o’ ‘r’ ‘l’ ‘d’ 실행 실행 터미널-1 / 서버측 실행 $ hello_ext_server ■ 실행 터미널-2 / 클라이언트측 실행 $ gcc -o hello_ext_client hello_ext_client.c $ hello_client print received Data : hello, world test received Data : $ 8

9 ① 연결요청 : 서버 프로그램에 연결 요청 (클라이언트 -> 서버) ① 연결요청 : 서버 프로그램에 연결 요청 (클라이언트 -> 서버) ② ls 요청 : 문자열 ‘ls’ 전송 (클라이언트 -> 서버) ③ 문자열 전송 : 파일 목록 문자열 전송 (서버 -> 클라이언트) ④ 화면 출력 : 파일 목록 문자열 화면 출력 9

10 list.c 실행 실행 터미널-1 / 서버측 실행 $ gcc -o list list.c $ ls 1 #include <dirent.h> 2 #include <stdio.h> 3 4 main( ) 5 { 6 DIR *dp; 7 struct dirent *dir; 8 9 if((dp = opendir(".")) == NULL) { 10 fprintf(stderr, "directory open error\n"); 11 exit(-1); 12 } 13 14 while((dir = readdir(dp)) != NULL) { 15 if(dir->d_ino == 0) continue; 16 17 printf("%s\n", dir->d_name); 18 } 19 20 closedir(dp); 21 } 실행 실행 터미널-1 / 서버측 실행 $ gcc -o list list.c $ ls a.out cli hello_client.c hello_server.c list list.c ser $ list . ser hello_client.c hello_server.c .. a.out list list.c cli $ 10

11 구조체 struct dirent { long d_ino; // I-노드 번호 off_t d_off; // offset unsigned short d_reclen; // 파일 이름 길이 char d_name[NAME_MAX+1]; // 파일 이름 } 함수 함수 디렉토리 스트림 포인터를 반환 파일 정보가 담긴 dirent 구조채 #include <dirent.h> DIR *opendir(const char *dirname); #include <dirent.h> struct dirent *readdir(DIR *dirp); 함수 디렉토리를 닫는다. #include <dirent.h> int *closedir(DIR* dp); 11

12 파일 목록 출력 소켓 프로그램 / 서버 40 while(1) { 41 len = sizeof(c_addr); 42 c_socket = accept(s_socket, (struct sockaddr *) &c_addr, &len); 43 44 length = 0; 45 temp = rBuffer; 46 while((n = read(c_socket, temp, 1)) > 0) { 47 if(*temp == '\r') continue; 48 if(*temp == '\n') break; 49 if(*temp == '\0') break; 50 51 if(length == BUFSIZ) break; 52 temp++; length++; 53 } 54 55 rBuffer[length] = '\0'; 56 57 if(!strcmp(rBuffer, "ls") ) { 58 59 if((dp = opendir(".")) == NULL) { 60 write(c_socket, err_1, strlen(err_1)); 61 } else { 62 while((dir = readdir(dp)) != NULL) { 63 if(dir->d_ino == 0) continue; 64 65 write(c_socket, dir->d_name, strlen(dir->d_name)); 66 write(c_socket, " ", 1); 67 } 68 closedir(dp); 69 } 70 } 71 close(c_socket); 72 } 12

13 ☎ ☎ ☎ ☎ 연결요청 “ls” ‘l’ ‘s’ \r \n internet “a.c b.c c.c” ‘a’ ‘.’ ‘c’ shell ls 서버 $ telnet 192.1.2.3 9000 ls[enter] 소켓 2156 IP 주소 IP 주소 9000 소켓 ☎ internet ☎ “a.c b.c c.c” ‘a’ ‘.’ ‘c’ ‘ ’ ‘b’ ‘.’ ‘c’ ‘ ’ ‘c’ ‘.’ ‘c’ EOF 연결요청 “ls” ‘l’ ‘s’ \0 ls 서버 print ls 클라이언트 소켓 2354 IP 주소 IP 주소 9000 소켓 ☎ internet ☎ “a.c b.c c.c” ‘a’ ‘.’ ‘c’ ‘ ’ ‘b’ ‘.’ ‘c’ ‘ ’ ‘c’ ‘.’ ‘c’ EOF 13

14 실행 실행 터미널-1 / 서버측 실행 $ ls a.out list ls_client ls_server list.c ls_client.c ls_server.c $ ls_server ■ 실행 터미널-2 / 클라이언트측 실행 $ telnet 127.0.0.1 9000 Trying 127.0.0.1... Connected to it (127.0.0.1). Escape character is '^]'. ls . ls_server.c .. a.out ls_client list ls_client.c list.c ls_server Connection closed by foreign host. $ 14

15 파일 목록 출력 소켓 프로그램 / 클라이언트 ☎ ☎ 연결요청 “ls” ‘l’ ‘s’ \0 print internet 2354 9000 소켓 ☎ IP 주소 IP 주소 internet ☎ “a.c b.c c.c” ‘a’ ‘.’ ‘c’ ‘ ’ ‘b’ ‘.’ ‘c’ ‘ ’ ‘c’ ‘.’ ‘c’ EOF 32 if(connect(c_socket, (struct sockaddr *) &c_addr, sizeof(c_addr)) == -1) { 33 printf("Can not connect\n"); 34 close(c_socket); 35 return -1; 36 } 37 38 scanf("%s", buffer); 39 buffer[strlen(buffer)] = '\0'; 40 if((n = write(c_socket, buffer, strlen(buffer)+1)) < 0) { 41 printf("write error\n"); 42 exit(-1); 43 } 44 45 temp = rcvBuffer; 46 while((n = read(c_socket, temp, 1)) > 0) { 47 if(length == BUFSIZ) break; 48 temp++; length++; 49 } 50 51 rcvBuffer[length] = '\0'; 52 53 printf("received Data : %s\n", rcvBuffer); 54 55 close(c_socket); 56 } 15

close(c_socket); ☎ EOF ☎ n = read(c_socket, temp, 1); 16

17 ☎ ☎ 연결요청 “ls” ‘l’ ‘s’ \0 print internet “a.c b.c c.c” ‘a’ ‘.’ ‘c’ 소켓 2354 9000 소켓 ls 서버 ☎ IP 주소 IP 주소 internet ☎ “a.c b.c c.c” ‘a’ ‘.’ ‘c’ ‘ ’ ‘b’ ‘.’ ‘c’ ‘ ’ ‘c’ ‘.’ ‘c’ EOF 실행 실행 터미널-1 / 서버측 실행 $ ls_server ■ 실행 터미널-2 / 클라이언트측 실행 $ ls_cli ls received Data : . ls_server.c .. a.out ls_client list ls_client.c list.c ls_server $ 17

18 네트워크 연결상태는 ping 명령으로 가능 $ ping IP_주소 참고 네트워크 연결상태는 ping 명령으로 가능 $ ping IP_주소 ping 명령이 정상이면 두 컴퓨터 간에 자료의 교환이 가능한 상태 이므로 서버의 보안 설정을 확인하는 것이 좋다. 18