vi 사용법

Similar documents
The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

PowerPoint 프레젠테이션

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

IPv6 적용

본 강의에 들어가기 전

The Pocket Guide to TCP/IP Sockets: C Version

1장. 유닉스 시스템 프로그래밍 개요

2009년 상반기 사업계획

본 강의에 들어가기 전

본 강의에 들어가기 전

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

PowerPoint 프레젠테이션

untitled

PowerPoint 프레젠테이션

본 강의에 들어가기 전

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

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

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

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

PowerPoint 프레젠테이션

K&R2 Reference Manual 번역본

제1장 Unix란 무엇인가?

The Pocket Guide to TCP/IP Sockets: C Version

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

Microsoft PowerPoint - lab14.pptx

/chroot/lib/ /chroot/etc/

SYN flooding

슬라이드 1

untitled

Microsoft Word - Network Programming_NewVersion_01_.docx

PowerPoint 프레젠테이션

chap7.key

PowerPoint 프레젠테이션

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

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

교육지원 IT시스템 선진화

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

Sena Technologies, Inc. HelloDevice Super 1.1.0

Microsoft PowerPoint - 09-Pipe

Chapter 4 UDP 소켓 사용법

PowerPoint 프레젠테이션

제1장 Unix란 무엇인가?

PowerPoint 프레젠테이션

PowerPoint 프레젠테이션

1장. 유닉스 시스템 프로그래밍 개요

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

제1장 Unix란 무엇인가?


제12장 파일 입출력

제1장 Unix란 무엇인가?

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

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

슬라이드 1

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770>

[ 목차 ] 1. 취약점개요 2. 배경지식 3. 취약점발생결과 (exploit 테스트 ) 4. 취약점발생원인분석 4.1 취약점 Q&A 5. exploit 분석 6. 보안대책 7. 결론 8. 레퍼런스 2

고급 프로그래밍 설계

The Pocket Guide to TCP/IP Sockets: C Version

KEY 디바이스 드라이버

학번 : 이름 : 1. 다음파일트리구조를가진유닉스시스템이있다고가정하자. / /bin/ /home/ /home/taesoo/ /usr/ /usr/lib/ /usr/local/lib /media 모든폴더에파일이하나도없다고가정했을때사용자가터미널에서다음 ls 명령입력시화면출력


Microsoft PowerPoint - lab15.pptx

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

Microsoft PowerPoint - 15-EmbedSW-10-Socket

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

PowerPoint 프레젠테이션

Microsoft PowerPoint - lab16.pptx

6주차.key

PowerPoint 프레젠테이션

슬라이드 1

untitled

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

ronny report( wooyaggo, hkpco ).hwp

Microsoft PowerPoint - chap12-고급기능.pptx

EA0015: 컴파일러

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

C++-¿Ïº®Çؼ³10Àå

fprintf(fp, "clf; clear; clc; \n"); fprintf(fp, "x = linspace(0, %d, %d)\n ", L, N); fprintf(fp, "U = [ "); for (i = 0; i <= (N - 1) ; i++) for (j = 0

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

Chapter_02-3_NativeApp

2009년 상반기 사업계획

제9장 프로세스 제어

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

<4D F736F F F696E74202D20C1A63132B0AD20B5BFC0FB20B8DEB8F0B8AEC7D2B4E7>

5.스택(강의자료).key

<4D F736F F F696E74202D FB8DEB8F0B8AE20B8C5C7CE205BC8A3C8AF20B8F0B5E55D>

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

Microsoft PowerPoint - [2009] 02.pptx

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

2009년 상반기 사업계획

슬라이드 1

보안(KDN)

<4D F736F F F696E74202D FC7C1B7CEBCBCBDBA20BBFDBCBAB0FA20BDC7C7E0205BC8A3C8AF20B8F0B5E55D>

Transcription:

네트워크프로그래밍 6 장과제샘플코드 - 1:1 채팅 (udp 버전 )

과제 서버에서먼저 bind 하고그포트를다른사람에게알려줄것 클라이언트에서알려준포트로접속 서로간에키보드입력을받아상대방에게메시지전송 2

Makefile 1 SRC_DIR =../../common 2 COM_OBJS = $(SRC_DIR)/addressUtility.o $(SRC_DIR)/dieWithMessage.o ucprocess.o 3 SRV_OBJS = ucserver.o 4 CLI_OBJS = ucclient.o 5 6 CFLAGS = -g -std=gnu99 7 CC = gcc 8 9 all: 10 make ucserver 11 make ucclient 12 13 ucserver : $(COM_OBJS) $(SRV_OBJS) 14 gcc -o ucserver $(CFLAGS) $(COM_OBJS) $(SRV_OBJS) 15 16 ucclient : $(COM_OBJS) $(CLI_OBJS) 17 gcc -o ucclient $(CFLAGS) $(COM_OBJS) $(CLI_OBJS) 18 19 install : 20 mv ucserver ucclient ~/bin 21 22 clean : 23 rm *.o ucserver ucclient 3

ucprotocol.h 1 #ifndef UC_PROTOCOL_H_ 2 #define UC_PROTOCOL_H_ 3 4 #include <stdint.h> 5 #include <unistd.h> 6 7 enum { 8 MAX_WIRE_SIZE = 512, 9 MAX_MSG_SIZE = 500 10 }; 11 12 int read_and_sendto(int ifd, char *nickname, int sock, struct sockaddr *toaddr); 13 int recvfrom_and_write(int sock, struct sockaddr *fromaddr, int ofd); 14 #endif 4

ucprocess.c (1) 1 #include <stdlib.h> 2 #include <string.h> 3 #include <sys/types.h> 4 #include <sys/socket.h> 5 #include <netdb.h> 6 #include "../../common/practical.h" 7 #include "ucprotocol.h" 8 9 /******************************************************************************/ 10 int read_and_sendto(int ifd, char *nickname, int sock, struct sockaddr *toaddr) 11 { 12 uint8_t snd_msg[max_msg_size] = {0}; 13 uint8_t outbuf[max_wire_size] = {0}; 14 15 if (read(ifd, snd_msg, MAX_MSG_SIZE) <= 0) { 16 fprintf(stderr, "Read ERROR!\n"); 17 return 0; 18 } 5

ucprocess.c (2) 19 else { 20 sprintf(outbuf, "%s: ", nickname); 21 strncat(outbuf, snd_msg, MAX_WIRE_SIZE - strlen(outbuf)); 22 23 int buf_len = strlen(outbuf); 24 ssize_t numbytessent = sendto(sock, outbuf, buf_len, 0, 25 toaddr, sizeof(*toaddr)); 26 27 if (numbytessent!= buf_len) { 28 fprintf(stderr, "Write ERROR!\n"); 29 return 0; 30 } 31 } 32 return 1; 33 } 34 6

ucprocess.c (3) 35 /******************************************************************************/ 36 int recvfrom_and_write(int sock, struct sockaddr *fromaddr, int ofd) 37 { 38 uint8_t inbuf[max_wire_size] = {0}; 39 int addrlen = sizeof(*fromaddr); 40 41 ssize_t numbytesrcvd = recvfrom(sock, &inbuf, MAX_WIRE_SIZE, 0, 42 fromaddr, &addrlen); 43 if (numbytesrcvd < 0) 44 return 0; 45 46 if (write(ofd, inbuf, MAX_WIRE_SIZE) <= 0) { 47 fprintf(stderr, "Write ERROR!\n"); 48 return 0; 49 } 50 return 1; 51 } 7

ucserver.c (1) 1 #include <stdlib.h> 2 #include <string.h> 3 #include <sys/types.h> 4 #include <sys/socket.h> 5 #include <netdb.h> 6 #include "../../common/practical.h" 7 #include "ucprotocol.h" 8 9 /******************************************************************************/ 10 int main(int argc, char *argv[]) { 11 12 if (argc!= 2) // 명령어행의인자개수가알맞은지확인 13 DieWithUserMessage("Parameter(s)", "<Server Port/Service>"); 14 15 char *service = argv[1]; // 첫번째인자 : 지역포트 / 서비스이름 16 17 struct addrinfo addrcriteria; // 원하는주소기준설정 18 memset(&addrcriteria, 0, sizeof(addrcriteria)); // 구조체를 0으로초기화 19 addrcriteria.ai_family = AF_UNSPEC; // IPv4,IPv6 모두반환 20 addrcriteria.ai_flags = AI_PASSIVE; // 주소 / 포트에무관하게반환 21 addrcriteria.ai_socktype = SOCK_DGRAM; // 데이터그램소켓만반환 22 addrcriteria.ai_protocol = IPPROTO_UDP; // UDP만반환 23 8

ucserver.c (2) 24 struct addrinfo *servaddr; 25 int rtnval = getaddrinfo(null, service, &addrcriteria, &servaddr); 26 if (rtnval!= 0) 27 DieWithUserMessage("getaddrinfo() failed", gai_strerror(rtnval)); 28 29 int sock = socket(servaddr->ai_family, servaddr->ai_socktype, 30 servaddr->ai_protocol); 31 if (sock < 0) 32 DieWithSystemMessage("socket() failed"); 33 34 if (bind(sock, servaddr->ai_addr, servaddr->ai_addrlen) < 0) 35 DieWithSystemMessage("bind() failed"); 36 37 int in_the_session = 0; 38 39 struct sockaddr_storage clntaddr; 40 socklen_t clntaddrlen = sizeof(clntaddr); 9

ucserver.c (3) 42 fd_set master_set, read_set; 43 44 FD_ZERO(&master_set); 45 FD_SET(0, &master_set); 46 FD_SET(sock, &master_set); 47 48 while(read_set = master_set, select(sock+1, &read_set, NULL, NULL, NULL) > 0) { 49 if (FD_ISSET(0, &read_set) && in_the_session) { 50 if (in_the_session) { 51 if (!read_and_sendto(0, "SERVER", sock, 52 (struct sockaddr *)&clntaddr)) 53 DieWithSystemMessage("sendto() failed"); 54 } 55 } 10

ucserver.c (4) 56 if (FD_ISSET(sock, &read_set)) { 57 if (!recvfrom_and_write(sock, (struct sockaddr *) &clntaddr, 1)) { 58 DieWithSystemMessage("recvfrom() failed"); 59 } 60 61 if (!in_the_session) { // First message 62 fputs("handling client ", stdout); 63 PrintSocketAddress((struct sockaddr *) &clntaddr, stdout); 64 fprintf(stdout, "\n"); 65 in_the_session = 1; 66 } 67 } 68 } 69 freeaddrinfo(servaddr); 70 close(sock); 71 } 11

ucclient.c (1) 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <sys/socket.h> 6 #include <netdb.h> 7 #include "../../common/practical.h" 8 #include "ucprotocol.h" 9 10 /******************************************************************************/ 11 int main(int argc, char *argv[]) { 12 13 if (argc!= 4 ) // 명령어행인자의개수가알맞은지확인 14 DieWithUserMessage("Parameter(s)", 15 "<Server Address/Name> <Server Port/Service> <nickname>"); 16 17 char *server = argv[1]; // 첫번쨰인자 : 서버의주소 / 이름 18 char *servport = argv[2]; // 두번째인자 : 서버포트 / 서비스이름 19 char *nickname = argv[3]; // 세번째인자 : 별명 20 12

ucclient.c (2) 21 // 어떤형태의주소를원하는지시스템에알림 22 struct addrinfo addrcriteria; // 원하는주소기준설정 23 memset(&addrcriteria, 0, sizeof(addrcriteria)); // 구조체를 0으로초기화 24 addrcriteria.ai_family = AF_UNSPEC; // IPV4,IPV6 모두반환 25 addrcriteria.ai_socktype = SOCK_DGRAM; // 데이터그램소켓만반환 26 addrcriteria.ai_protocol = IPPROTO_UDP; // TCP만반환 27 28 // 주소들획득 29 30 struct addrinfo *addr; 31 struct addrinfo *servaddr; // 서버주소의리스트 32 33 int rtnval = getaddrinfo(server, servport, &addrcriteria, &servaddr); 34 if (rtnval!= 0) 35 DieWithUserMessage("getaddrinfo() failed", gai_strerror(rtnval)); 36 37 int sock = -1; 38 for (addr = servaddr; addr!= NULL; addr = addr->ai_next) { 39 // 데이터그램 UDP소켓생성 40 sock = socket(addr->ai_family, addr->ai_socktype, 41 addr->ai_protocol); // 클라이언트소켓식별자 42 if (sock > 0) 43 break; 44 } 13

ucclient.c (3) 46 fd_set master_set, read_set; 47 48 FD_ZERO(&master_set); 49 FD_SET(0, &master_set); 50 FD_SET(sock, &master_set); 51 52 while(read_set = master_set, select(sock+1, &read_set, NULL, NULL, NULL) > 0) { 53 if (FD_ISSET(0, &read_set)) { 54 if (!read_and_sendto(0, nickname, sock, addr->ai_addr)) 55 DieWithSystemMessage("sendto() failed"); 56 } 57 58 if (FD_ISSET(sock, &read_set)) { 59 struct sockaddr_storage fromaddr; 60 61 if (!recvfrom_and_write(sock, (struct sockaddr *) &fromaddr, 1) ) { 62 DieWithSystemMessage("recvfrom() failed"); 63 } 64 } 65 } 66 67 freeaddrinfo(servaddr); 68 close(sock); 69 70 exit(0); 71 } 14