PowerPoint 프레젠테이션

Similar documents
PowerPoint 프레젠테이션

2009년 상반기 사업계획

2009년 상반기 사업계획

Microsoft PowerPoint - 12 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 1.ppt

제1장 Unix란 무엇인가?

Microsoft PowerPoint - 13 ¼ÒÄÏÀ» ÀÌ¿ëÇÑ Åë½Å 2.ppt

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

슬라이드 1

The Pocket Guide to TCP/IP Sockets: C Version

슬라이드 1

제1장 Unix란 무엇인가?

본 강의에 들어가기 전

본 강의에 들어가기 전

Microsoft PowerPoint - Supplement-02-Socket Overview.ppt [호환 모드]

À©µµ³×Æ®¿÷ÇÁ·Î±×·¡¹Ö4Àå_ÃÖÁ¾

The Pocket Guide to TCP/IP Sockets: C Version

PowerPoint 프레젠테이션

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

Microsoft PowerPoint - 09-CE-23-윈도우 소켓

본 강의에 들어가기 전

슬라이드 1

vi 사용법

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - ch09_파이프 [호환 모드]

2009년 상반기 사업계획

Microsoft PowerPoint - 06-CompSys-16-Socket.ppt

Microsoft Word - Network Programming_NewVersion_01_.docx

Network Programming

Network Programming

10. 시스템 프로그래밍

Microsoft PowerPoint - 15-EmbedSW-10-Socket

SYN flooding

Microsoft PowerPoint UnixNetProg.ppt [호환 모드]

The Pocket Guide to TCP/IP Sockets: C Version

Chapter 4 UDP 소켓 사용법

Microsoft PowerPoint - UnixNetProg.ppt [호환 모드]

슬라이드 1

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - 04-UDP Programming.ppt

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

IPv6 적용

9장 윈도우 소켓 프로그래밍

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

Microsoft PowerPoint - 03-TCP Programming.ppt

The Pocket Guide to TCP/IP Sockets: C Version

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 4 가지중하나. (1) 프로그램수행직후, (2) kill 명령실행직후, (3) 15 #include <signal.

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770>


<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint PythonGUI-socket

PowerPoint 프레젠테이션

hd132x_k_v1r3_Final_.PDF

<4D F736F F D2034C0E52D554E495820BCD2C4CF20C0C0BFEB20C7C1B7CEB1D7B7A1B9D6>

FlightGear 2.10

자바-11장N'1-502

이번장에서학습할내용 동적메모리란? malloc() 와 calloc() 연결리스트 파일을이용하면보다많은데이터를유용하고지속적으로사용및관리할수있습니다. 2

슬라이드 1

0x00 Contents 0x About Nickster 0x Analaysis 0x Exploit

11장 포인터

Microsoft PowerPoint C-구조체

3. 다음장에나오는 sigprocmask 함수의설명을참고하여다음프로그램의출력물과그출력물이화면이표시되는시점을예측하세요. ( 힌트 : 각줄이표시되는시점은다음 6 가지중하나. (1) 프로그램수행직후, (2) 5 초후 (3) 10 초후 (4) 15 #include <signa

Microsoft PowerPoint - all_CDSP_2(2009).ppt [호환 모드]

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - Lecture_Note_2.ppt [Compatibility Mode]

PowerPoint 프레젠테이션

2009년 상반기 사업계획

Microsoft Word - KPMC-400,401 SW 사용 설명서

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

Microsoft PowerPoint - chap13-입출력라이브러리.pptx

슬라이드 1

Microsoft PowerPoint - chap10-함수의활용.pptx

untitled

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

chap7.key

Sena Technologies, Inc. HelloDevice Super 1.1.0

K&R2 Reference Manual 번역본

Microsoft PowerPoint - chap06-2pointer.ppt

학번 : 이름 1. 다음프로그램실행결과를예측하시오. $./a.out & [1] 7216 $ kill -USR $ kill -USR 아래학생이작성한쓰레드코드의문제점을설명하시오. void* thread_main() { pthread_mutex_t

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Unix Network Programming Chapter 4. Elementary TCP Sockets

bn2019_2

Microsoft PowerPoint - 09-CE-24-채팅 프로그램

4. What will be the output of this program? Explain results for each variable and each thread. #include "apue.h" int var=1; pthread_mutex_t lock; void

제1장 Unix란 무엇인가?

목차 목차포트스캔코드포트스캔결과포트스캔탐지코드포트스캔탐지결과 참조

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Chapter #01 Subject

<4D F736F F F696E74202D20B3D7C6AEBFF6C5A9C7C1B7CEB1D7B7A1B9D65F FBCD2C4CF5FC3A4C6C35FBFA1C4DA2E BC8A3C8A

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]


금오공대 컴퓨터공학전공 강의자료

제20회_해킹방지워크샵_(이재석)

리눅스 취약점대응방안권고 / KISA 취약점점검팀 영향받는플랫폼 OS, FAQ 추가 개요 미국보안회사 에의해 시스템의 라이브러리 의특정함수에서임의코드를실행할수있는취약점이공개 해당취약점은 CVE 지정, 도메인네임을

Sena Device Server Serial/IP TM Version

Transcription:

Socket Programming 1 Jo, Heeseung

학습목표 TCP/IP 프로토콜의기본개념 IP 주소와포트번호의개념소켓관련구조체와함수소켓을이용한통신프로그램을작성 2

TCP/IP 개요 TCP/IP 인터넷의표준프로토콜 5계층 (4계층) 으로구성 TCP 와 UDP 의차이 3

IP 주소와호스트명 IP 주소와호스트명 IP 주소 : 인터넷을이용할때사용하는주소로점 (.) 으로구분된 32 비트숫자 호스트명 : 시스템에부여된이름 DNS : 호스트명 ( 도메인명 ) 과 IP 주소를관리하는서비스 호스트명과 IP 주소변환 hosts: files dns /etc/hosts 파일또는 DNS, NIS 등 /etc/nsswitch.conf 파일에주소변환을누가할것인지지정 4

IP 주소와호스트명 호스트명으로정보검색 : gethostbyname(3) #include <netdb.h> struct hostent *gethostbyname(const char *name); IP 주소로정보검색 : gethostbyaddr(3) #include <netdb.h> struct hostent *gethostbyaddr(const char *addr, int len, int type); type 에지정할수있는값 AF_UNSPEC 0 /* 미지정 */ AF_UNIX 1 /* 호스트내부통신 */ AF_INET 2 /* 인터네트워크통신 : UDP, TCP 등 */ AF_IMPLINK 3 /* Arpanet의 IMP 주소 */ AF_PUP 4 /* PUP 프로토콜 : BSP 등 */ AF_CHAOS 5 /* MIT의 CHAOS 프로토콜 */ AF_NS 6 /* XEROX의 NS 프로토콜 */ AF_NBS 7 /* NBS 프로토콜 */ 5

포트번호 포트번호 호스트에서동작하고있는서비스를구분하는번호 2바이트정수로 0~65535까지사용가능 Well known port : 이미정해져있고자주사용하는포트 - 텔넷 (23), HTTP(80), FTP(21) 관련파일 : /etc/services 6

소켓프로그래밍기초 [1] 소켓의종류 AF_UNIX : 유닉스도메인소켓 ( 시스템내부프로세스간통신 ) AF_INET : 인터넷소켓 ( 네트워크를이용한통신 ) 소켓의통신방식 SOCK_STREAM : TCP 사용 SOCK_DGRAM : UDP 사용 AF_UNIX AF_UNIX AF_INET AF_INET SOCK_STREAM SOCK_DGRAM SOCK_STREAM SOCK_DGRAM 7

TCP vs. UDP 8

소켓프로그래밍기초 [2] 소켓주소구조체 유닉스도메인소켓의주소구조체 struct sockaddr_un { sa_family_t sun_family; char sun_path[108] }; sun_family : AF_UNIX sun_path : 통신에사용할파일의경로명 인터넷소켓의주소구조체 struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; }; struct in_addr { in_addr_t s_addr; }; 9

소켓프로그래밍기초 [3] 바이트순서함수 정수를저장하는방식 : 빅엔디안, 리틀엔디안 빅엔디안 : 메모리의낮은주소에정수의첫바이트를위치 -> 모토로라, 썬 리틀엔디안 : 메모리의높은주소에정수의첫바이트를위치 -> 인텔 TCP/IP 네트워크에서바이트순서표준 : 빅엔디안 호스트바이트순서 (HBO) : 시스템에서사용하는바이트순서 네트워크바이트순서 (NBO) : 네트워크에서사용하는바이트순서 #include <sys/types.h> #include <netinet/in.h> #include <inttypes.h> uint32_t htonl(unit32_t hostlong); uint16_t htons(unit16_t hostshort); uint32_t ntohl(unit32_t netlong); uint16_t ntohs(unit16_t netshort); htonl : 32 비트 HBO 를 32 비트 NBO 로변환 htons : 16 비트 HBO 를 16 비트 NBO 로변환 ntohl : 32 비트 NBO 를 32 비트 HBO 로변환 ntohs : 16 비트 NBO 를 16 비트 HBO 로변환 10

IP 주소변환함수 IP 주소의형태 192.168.10.1과같이점 (.) 으로구분된형태 시스템내부저장방법 : 이진값으로바꿔서저장 사용자사용형태 : 문자열로사용 문자열형태의 IP 주소를숫자형태로변환 : inet_addr(3) #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> in_addr_t inet_addr(const char *cp); 192.168.11.11 구조체형태의 IP 주소를문자열형태로변환 : inet_ntoa(3) #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> char *inet_ntoa(const struct in_addr in); 13

[ 예제 11-5] IP 주소변환하기... 09 int main(void) { 10 in_addr_t addr; 11 struct hostent *hp; 12 struct in_addr in; 13 14 if ((addr = inet_addr("218.237.65.4")) == (in_addr_t)-1) { 15 printf("error : inet_addr(218.237.65.4\n"); 16 exit(1); 17 } 18 19 hp = gethostbyaddr((char *)&addr, 4, AF_INET); 20 if (hp == NULL) { 21 (void) printf("host information not found\n"); 22 exit(2); 23 } 24 25 printf("name=%s\n", hp->h_name); 26 27 (void) memcpy(&in.s_addr, *hp->h_addr_list, sizeof (in.s_addr)); 28 printf("ip=%s\n", inet_ntoa(in)); 29 30 return 0; 31 } 문자열형태를이진형태로변환 주소로호스트명검색 구조체형태에서문자열로변환하여출력 # gcc -o ex11_5.out ex11_5.c -lsocket -lnsl # ex11_5.out Name=www.hanb.co.kr IP=218.237.65.4 14

소켓인터페이스함수 [1] 소켓인터페이스함수 socket : 소켓파일기술자생성 bind : 소켓파일기술자를지정된 IP 주소 / 포트번호와결합 (bind) listen : 클라이언트의접속요청대기 connect : 클라이언트가서버에접속요청 accept : 클라이언트의접속허용 recv : 데이터수신 (SOCK_STREAM) send : 데이터송신 (SOCK_STREAM) recvfrom : 데이터수신 (SOCK_DGRAM) sendto : 데이터송신 (SOCK_DGRAM) close : 소켓파일기술자종료 15

TCP 소켓함수의호출순서 16

소켓인터페이스함수 [2] 소켓생성하기 : socket(2) #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); domain : 소켓종류 (AF_UNIX, AF_INET) type : 통신방식 (TCP, UDP) protocol : 소켓에이용할프로토콜 int sd; sd = socket(af_inet, SOCK_STREAM, 0); 19

소켓인터페이스함수 [3] 소켓에이름지정하기 : bind(3) #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> int bind(int s, const struct sockaddr *name, int namelen); name : 소켓의이름을표현하는구조체 int sd; struct sockaddr_in sin; memset((char *)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(9000); sin.sin_addr.s_addr = inet_addr("192.168.100.1"); memset(&(sin.sin_zero), 0, 8); bind(sd, (struct sockaddr *)&sin, sizeof(struct sockaddr)); struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; }; struct in_addr { in_addr_t s_addr; }; 20

소켓인터페이스함수 [4] 클라이언트연결기다리기 : listen(3) #include <sys/types.h> #include <sys/socket.h> int listen(int s, int backlog); backlog : 최대허용클라이언트수 listen(sd, 10); 연결요청수락하기 : accept(3) #include <sys/types.h> #include <sys/socket.h> int accept(int s, struct sockaddr *addr, socklen_t *addrlen); addr: 접속을요청한클라이언트의 IP 정보 int sd, new_sd; struct sockaddr_in sin, clisin; new_sd = accept(sd, &clisin, &sizeof(struct sockaddr_in)); 21

소켓인터페이스함수 [5] 서버와연결하기 : connect(3) #include <sys/types.h> #include <sys/socket.h> int connect(int s, const struct sockaddr *name, int namelen); name : 접속하려는서버의 IP 정보 int sd; struct sockaddr_in sin; memset((char *)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(9000); sin.sin_addr.s_addr = inet_addr("192.168.100.1"); memset(&(sin.sin_zero), 0, 8); struct sockaddr_in { sa_family_t sin_family; in_port_t sin_port; struct in_addr sin_addr; }; struct in_addr { in_addr_t s_addr; }; connect(sd, (struct sockaddr *)&sin, sizeof(struct sockaddr)); 22

소켓인터페이스함수 [6] 데이터보내기 : send(3) #include <sys/types.h> #include <sys/socket.h> ssize_t send(int s, const void *msg, size_t len, int flags); char *msg = "Send Test\n"; int len = strlen(msg) + 1; if (send(sd, msg, len, 0) == -1) { perror("send"); exit(1); } 23

소켓인터페이스함수 [6] 데이터받기 : recv(3) #include <sys/types.h> #include <sys/socket.h> ssize_t recv(int s, void *buf, size_t len, int flags); char buf[80]; int len, rlen; if ((rlen = recv(sd, buf, len, 0)) == -1) { perror("recv"); exit(1); } 24

소켓인터페이스함수 [7] UDP 데이터보내기 : sendto(3) #include <sys/types.h> #include <sys/socket.h> ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, int tolen); to : 메시지를받을호스트의주소 char *msg = "Send Test\n"; int len = strlen(msg) + 1; struct sockaddr_in sin; int size = sizeof(struct sockaddr_in); memset((char *)&sin, '\0', sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons(9000); sin.sin_addr.s_addr = inet_addr("192.168.10.1"); memset(&(sin.sin_zero), 0, 8); if (sendto(sd, msg, len, 0, (struct sockaddr *)&sin, size) == -1) { perror("sendto"); exit(1); } 25

소켓인터페이스함수 [3] UDP 데이터받기 : recvfrom(3) #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, int *fromlen); from : 메시지를보내는호스트의주소 char buf[80]; int len, size; struct sockaddr_in sin; if (recvfrom(sd, buf, len, 0, (struct sockaddr *)&sin, &size) == -1) { perror("recvfrom"); exit(1); } 26

소켓인터페이스함수 [4] Port 재사용을위한 setsockopt() 프로그램에서 port 를사용후종료시해당 port 는일정시간동안다시사용되지안도록되어있음 반복적인테스트단계에서이를해제하기위하여아래와같은방법을이용...... if ((sd = socket(af_inet, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } int optvalue=1; setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, &optvalue, sizeof(optvalue));...... 27

[ 예제 11-7] (1) 인터넷 TCP 소켓 ( 서버 )... 09 #define PORTNUM 9000 10 11 int main(void) { 12 char buf[256]; 13 struct sockaddr_in sin, cli; 14 int sd, ns, clientlen = sizeof(cli); 15 16 if ((sd = socket(af_inet, SOCK_STREAM, 0)) == -1) { 17 perror("socket"); 18 exit(1); 소켓생성 19 } 20 21 memset((char *)&sin, '\0', sizeof(sin)); 22 sin.sin_family = AF_INET; 23 sin.sin_port = htons(portnum); 24 sin.sin_addr.s_addr = inet_addr("0.0.0.0"); 25 26 if (bind(sd, (struct sockaddr *)&sin, sizeof(sin))) { 27 perror("bind"); 28 exit(1); 29 } 포트번호 iter 에서는아래두파일을 include #include <arpa/inet.h> #include <sys/un.h> 소켓주소구조체생성 소켓기술자와소켓주소구조체연결 28

[ 예제 11-7] (1) 인터넷 TCP 소켓 ( 서버 ) 31 if (listen(sd, 5)) { 클라이언트접속요청대기 32 perror("listen"); 33 exit(1); 34 } 35 36 if ((ns = accept(sd, (struct sockaddr *)&cli, &clientlen))==-1){ 37 perror("accept"); 38 exit(1); 39 } 40 41 sprintf(buf, "Your IP address is %s", inet_ntoa(cli.sin_addr)); 42 if (send(ns, buf, strlen(buf) + 1, 0) == -1) { 43 perror("send"); 44 exit(1); 45 } 46 close(ns); 47 close(sd); 48 49 return 0; 50 } 클라이언트와연결 클라이언트로데이터보내기 29

[ 예제 11-7] (2) 인터넷 TCP 소켓 ( 클라이언트 )... 09 #define PORTNUM 9000 10 11 int main(void) { 12 int sd; 13 char buf[256]; 14 struct sockaddr_in sin; 15 포트번호 ( 각자자기만의포트번호사용 ) 소켓생성 16 if ((sd = socket(af_inet, SOCK_STREAM, 0)) == -1) { 17 perror("socket"); 18 exit(1); 19 } 20 21 memset((char *)&sin, '\0', sizeof(sin)); 22 sin.sin_family = AF_INET; 23 sin.sin_port = htons(portnum); 24 sin.sin_addr.s_addr = inet_addr("192.168.162.133"); 25 소켓주소구조체생성 30

[ 예제 11-7] (2) 인터넷 TCP 소켓 ( 클라이언트 ) 26 if (connect(sd, (struct sockaddr *)&sin, sizeof(sin))) { 27 perror("connect"); 28 exit(1); 서버에접속요청 29 } 30 31 if (recv(sd, buf, sizeof(buf), 0) == -1) { 32 perror("recv"); 33 exit(1); 서버가보낸데이터읽기 34 } 35 close(sd); 36 printf("from Server : %s\n", buf); 37 38 return 0; 39 } # gcc -o ex11_7s ex11_7-inet-s.c # gcc -o ex11_7c ex11_7-inet-c.c 서버 # ex11_7s.out # ex11_7c.out From Server : Your IP address is 192.168.162.131 클라이언트 31

[ 예제 12-5] (1) 인터넷 UDP 소켓 ( 서버 )... 09 #define PORTNUM 9005 10 11 int main(void) { 12 char buf[256]; 13 struct sockaddr_in sin, cli; 14 int sd, clientlen = sizeof(cli); 15 16 if ((sd = socket(af_inet, SOCK_DGRAM, 0)) == -1) { 17 perror("socket"); 18 exit(1); 소켓생성 ( 데이터그램 ) 19 } 20 21 memset((char *)&sin, '\0', sizeof(sin)); 22 sin.sin_family = AF_INET; 23 sin.sin_port = htons(portnum); 24 sin.sin_addr.s_addr = inet_addr("0.0.0.0"); 25 26 if (bind(sd, (struct sockaddr *)&sin, sizeof(sin))) { 27 perror("bind"); 28 exit(1); 29 } 포트번호 ( 각자자기만의포트번호사용 ) 소켓기술자와소켓주소구조체연결 소켓주소구조체생성 32

[ 예제 12-5] (1) 인터넷 UDP 소켓 ( 서버 ) 31 while (1) { 32 if ((recvfrom(sd, buf, 255, 0, 33 (struct sockaddr *)&cli, &clientlen)) == -1) { 34 perror("recvfrom"); 35 exit(1); 36 } 37 printf("** From Client : %s\n", buf); 38 strcpy(buf, "Hello Client"); 39 if ((sendto(sd, buf, strlen(buf)+1, 0, 40 (struct sockaddr *)&cli, sizeof(cli))) == -1) { 41 perror("sendto"); 42 exit(1); 43 } 44 } 45 46 return 0; 47 } 클라이언트의메시지수신 클라이언트로데이터보내기 33

[ 예제 12-5] (2) 인터넷 UDP 소켓 ( 클라이언트 )... 09 #define PORTNUM 9005 포트번호 10 11 int main(void) { 12 int sd, n; 13 char buf[256]; 14 struct sockaddr_in sin; 15 16 if ((sd = socket(af_inet, SOCK_DGRAM, 0)) == -1) { 17 perror("socket"); 18 exit(1); 19 } 20 21 memset((char *)&sin, '\0', sizeof(sin)); 22 sin.sin_family = AF_INET; 23 sin.sin_port = htons(portnum); 24 sin.sin_addr.s_addr = inet_addr("192.168.162.133"); 25 26 strcpy(buf, "I am a client."); 27 if (sendto(sd, buf, strlen(buf)+1, 0, 28 (struct sockaddr *)&sin, sizeof(sin)) == -1) { 29 perror("sendto"); 30 exit(1); 31 } 소켓생성 서버에메시지전송 소켓주소구조체생성 34

[ 예제 12-5] (2) 인터넷 UDP 소켓 ( 클라이언트 ) 33 n = recvfrom(sd, buf, 255, 0, NULL, NULL); 34 buf[n] = '\0'; 35 printf("** From Server : %s\n", buf); 36 37 return 0; 38 } 서버가보낸데이터읽기 # ex12_5s.out ** From Client : I am a client. # ex12_5c.out ** From Server : Hello Client 서버 클라이언트 35