슬라이드 1

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

PowerPoint 프레젠테이션

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

제1장 Unix란 무엇인가?

PowerPoint 프레젠테이션

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

The Pocket Guide to TCP/IP Sockets: C Version

2009년 상반기 사업계획

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

제1장 Unix란 무엇인가?

The Pocket Guide to TCP/IP Sockets: C Version

본 강의에 들어가기 전

슬라이드 1

본 강의에 들어가기 전

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

2009년 상반기 사업계획

슬라이드 1

슬라이드 1

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

The Pocket Guide to TCP/IP Sockets: C Version

vi 사용법

Chapter 4 UDP 소켓 사용법

본 강의에 들어가기 전

The Pocket Guide to TCP/IP Sockets: C Version

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

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

PowerPoint 프레젠테이션

Network Programming

Network Programming

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

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

SYN flooding

Microsoft PowerPoint - 03-TCP Programming.ppt

IPv6 적용

Microsoft PowerPoint - 15-EmbedSW-10-Socket

Microsoft Word - Network Programming_NewVersion_01_.docx

Microsoft PowerPoint - Lecture_Note_2.ppt [Compatibility Mode]

<43B7CE20BECBBEC6BAB8B4C220BCD2C4CFC7C1B7CEB1D7B7A1B9D62E687770>

Microsoft PowerPoint - 04-UDP Programming.ppt

10. 시스템 프로그래밍

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint UnixNetProg.ppt [호환 모드]

[ 네트워크 1] 3 주차 1 차시. IPv4 주소클래스 3 주차 1 차시 IPv4 주소클래스 학습목표 1. IP 헤더필드의구성을파악하고요약하여설명할수있다. 2. Subnet ID 및 Subnet Mask 를설명할수있고, 각클래스의사용가능한호스트수와사설 IP 주소및네트

The Pocket Guide to TCP/IP Sockets: C Version

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

Unix Network Programming Chapter 4. Elementary TCP Sockets

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

운영체제실습_명령어

<4D F736F F F696E74202D20B3D7C6AEBFF6C5A9C7C1B7CEB1D7B7A1B9D65F FBCD2C4CF5FC3A4C6C35FBFA1C4DA2E BC8A3C8A

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

The OSI Model

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

제1장 Unix란 무엇인가?

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint PythonGUI-socket

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

네트워크통신연결방법 네트워크제품이통신을할때, 서로연결하는방법에대해설명합니다. FIRST EDITION

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

<4D F736F F F696E74202D20C1A63235C0E520B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D628B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

Microsoft PowerPoint - 06-IPAddress [호환 모드]

자바-11장N'1-502

<4D F736F F D2034C0E52D554E495820BCD2C4CF20C0C0BFEB20C7C1B7CEB1D7B7A1B9D6>

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

PA for SWE2007

Chapter #01 Subject

<43B7CE20BECBBEC6BAB8B4C C5EBBDC52E687770>

PA for SWE2007

TCP.IP.ppt

PowerPoint 프레젠테이션

6주차.key

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

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

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

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

bn2019_2

제12장 파일 입출력

Microsoft PowerPoint - Lecture_Note_7.ppt [Compatibility Mode]


전송계층프로토콜 TCP(Transmission Control Protocol) 전송계층에서동작하는연결지향형 (connectionoriented) 프로토콜 데이터의흐름을관리하고, 데이터가정확한지검증하며통신 쓰리웨이핸드셰이킹 (three-way handshaking) 을통

슬라이드 1

API 매뉴얼

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

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

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

임베디드시스템설계강의자료 6 system call 1/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

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

PowerPoint 프레젠테이션

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

PowerPoint 프레젠테이션

슬라이드 1

게시판 스팸 실시간 차단 시스템

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

H3250_Wi-Fi_E.book

2. 인터네트워킹 서로떨어져있는각각의수많은네트워크들을연결하여하나의네트워크처럼연결하여사용할수있도록해주는것 3. 인터네트워킹에필요한장비 1 리피터 (Repeater) - 데이터가전송되는동안케이블에서신호의손실인감쇄 (Attenuation) 현상이발생하는데, 리피터는감쇄되는신

제1장 Unix란 무엇인가?

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

PA0 for SSE2033

슬라이드 1

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

Transcription:

Task 통신및동기화 : Socket Chapter #13

강의목차 소켓개요 소켓관련시스템콜 네트워크라이브러리 스트림소켓을이용한프로세스통신 데이터그램소켓을이용한프로세스통신 Unix System Programming 2

소켓 (Socket) 소켓 (Socket) 개요 (1) 프로세스간의통신을위한데이터출입구 파이프도구를일반화 양방향데이터통신을지원 상호연관성이없는프로세스간에통신이가능 로컬시스템의프로세스간에또는네트워크를통해원격시스템의프로세스와의통신을지원 Linux System Programming 3

소켓 (Socket) 소켓 (Socket) 개요 (2) Linux System Programming 4

바인딩 (binding) 소켓 (Socket) 개요 (3) 소켓을식별하기위해소켓에이름을붙이는기능 소켓이름을이용하여통신하고자하는상대방프로세스의소켓을지정하여통신가능 파일명, 정수형번호등을지정가능 bind() 시스템호출을사용 Linux System Programming 5

도메인 (Domain) 소켓 (Socket) 개요 (4) 소켓이름이통용되는범위 UNIX 도메인, INET 도메인 UNIX 도메인 동일한 UNIX 시스템안에서프로세스간에소켓을이용하여통신하는경우 파일의경로명을이용하여소켓이름을바인딩 소켓을생성할때마다새로운파일을생성하고그파일의경로명을소켓이름으로사용 Linux System Programming 6

소켓 (Socket) 개요 (5) INET 도메인 네트워크에연결된원격컴퓨터의프로세스간에소켓을이용하여통신하는경우 소켓이름으로포트번호 (port number) 을바인딩 소켓을식별하는 16비트정수 (0~65535) Well-known port 예 : 21번 (ftp), 23번 (telnet), 25번 (SMTP) 네트워크주소 (IP 주소 ) 사용 네트워크상에서통신하려는프로세스가동작하는컴퓨터시스템을식별하여지정하여야함 IP 주소 + 포트번호를이용하여통신할소켓을식별 UNIX 시스템내의프로세스간에서도유효 UNIX 도메일기능도수행 Linux System Programming 7

소켓의종류 소켓 (Socket) 개요 (6) 통신프로토콜의 transport layer에서제공하는통신수단에대응하여구분 Virtual circuit, Datagram Linux System Programming 8

소켓 (Socket) 개요 (7) Virtual Circuit(Stream Socket) 연결기반통신 (connection-based communication) 을지원 통신대상과연결 ( 논리적인접속 ) 을설정 연결을통해데이터송수신 통신이종료되면연결해제 cf) 전화연결 특정프로스간에대량의데이터를지속적으로송수신하는통신에이용 통신의신뢰성을보장 연결형프로토콜 TCP(Transmission Control Protocol) 을지원 Linux System Programming 9

소켓 (Socket) 개요 (8) Datagram(Datagram Socket) 비연결기반통신 (connectionless communication) 을지원 논리적링크를설정하기않고 network layer의기능을이용하여개개의데이터를필요할때마다통신상대를지정하여전송 cf) 편지 몇몇프로스간에약간의데이터를필요할때마다송수신하는통신에이용 데이터를송신할때마다수신주소를지정 통신의신뢰성을보장하지못함 데이터순서, 데이터내용및전송시간등을보장하지않음 비연결형프로토콜 UDP(User datagram Protocol) 을지원 Linux System Programming 10

클라이언트 - 서버통신모델 (1) 클라이언트 - 서버통신모델 통신하는프로세스들을역할에따라서버프로세스와클라이언트프로세스로나누어통신하는모델 서버프로세스 처리요구를받아서서비스를제공하는프로세스 클라이언트프로세스 서비스의처리요구를전송하는프로세스 소켓기반의통신에적용 Linux System Programming 11

클라이언트 - 서버통신모델 (2) 서버모형 반복서버 클라이언트프로세스에서전송된요구처리가단시간에해결가능한경우 서버프로세스가순차적으로클라이언트요구를처리하는방식 Linux System Programming 12

클라이언트 - 서버통신모델 (3) 서버모형 병행서버 클라이언트프로세스에서전송된요구처리에장시간이걸리거나시간을예측할수없는경우 서버프로세스가자식프로세스를생성하여클라이언트요구를서비스하는방식 Linux System Programming 13

클라이언트 - 서버통신모델 (4) 통신방식 동기통신 데이터송수신타이밍스케줄을미리정해놓고그스케줄에따라통신하는방식 타이밍을지키기위해대기시간을요구 Linux System Programming 14

클라이언트 - 서버통신모델 (5) 통신방식 비동기통신 데이터송수신타이밍스케줄을정해놓지않고송신자가필요할때에데이터를송신하고, 수신자를데이터가도착할때받아처리하는방식 타이밍을위한대기시간이필요없음 브로드캐스팅 (Broadcast) 통신상대를특별히정하기않고같은네트웤내의호스트전부에게데이터를전송하는방식 방송 Linux System Programming 15

소켓을이용한통신방법 (1) 스트림소켓을이용한통신방법 Linux System Programming 16

소켓을이용한통신방법 (2) 데이터그램소켓을이용한통신방법 Linux System Programming 17

소켓생성 : socket() #include <sys/types.h> #include <sys/socket.h> 소켓시스템콜 (1) int socket(int domain, int type, int protocol) /* int domain: 사용하는도메인종류지정 */ /* int type: 사용하는소켓종류지정 */ /* int protocol: 사용하는프로토콜지정 */ /* 정상종료하면소켓에대한파일디스크립터를반환하고, 에러가발생한경우에는 -1 를반환한다. 외부변수 errno 에에러를나타내는값을설정한다 */ 통신하는서버와클라이언트프로세스에서함께호출 Linux System Programming 18

소켓생성 : socket() 소켓시스템콜 (2) 도메인종류 domain 파라미터 도메인이름 설명 PF_UNIX, PF_LOCAL PF_INET PF_INET6 PF_IPX PF_NETLINK PF_X25 PF_AX25 PF_ATMPVC PF_APPLETALK PF_PACKET 로컬통신 IPv4 인터넷프로토콜 IPv6 인터넷프로토콜 IPX-Novell 프로토콜커널. 사용자. 디바이스 ITU_T X.25/ISO8208 프로토콜아마추어무선 AX.25 프로토콜 ATN PVC에액세스한다애플릿토크패킷인터페이스 PF_* 대신 AF_* 도지원함 Linux System Programming 19

소켓시스템콜 (3) 소켓생성 : socket() 소켓종류 type 파라미터 소켓이름 SOCK_STREAM SOCK_DGRAM SOCK_SEQPACKET SOCK_RAW SOCK_RDM 설명 순서가있고신뢰성이높으며쌍방향으로접속된바이트스트림을제공 데이터그램전송 ( 접속, 신뢰성없음, 메시지의최대길이고정 ) 을지원 메시지의최대길이가고정된데이터그램전송경로를기초로순차성과신뢰성있는쌍방향접속에기반한통신을제공 낮은수준의네트워크프로토콜로액세스하는것을지원 신뢰성은있지만순서는보장할수없는데이터그램전송을지원 프로토콜종류 protocol 파라미터 대부분의경우, 0 으로지정 UNIX 가적절한프로토콜을선택 Linux System Programming 20

소켓이름설정 : bind() #include <sys/types.h> #include <sys/socket.h> 소켓시스템콜 (4) int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen) /* int sockfd: 소켓파일디스크립터 */ /* struct sockaddr *my_addr : 소켓주소정보구조체포인터 */ /* socklen_t addrlen : 소켓주소정보구조체의길이 */ /* 정상종료하면 0 을반환하고, 에러가발생한경우에는 -1 를반환한다. 외부변수 errno 에에러를나타내는값을설정한다 */ 생선된소켓에이름을지정 소켓식별에사용 소켓이름명명규칙은소켓의도메인에따라다름 UNIX 도메인 파일경로명 INET 도메인 IP 주소 + port 번호 Linux System Programming 21

소켓이름설정 : bind() 소켓시스템콜 (5) UNIX 도메인에서소켓이름지정 #include <sys/un.h> #define UNIX_PATH_MAX 108 struct sockaddr_un { sa_family_t sun_family; // PF_UNIX 지정 char sun_path[unix_path_max]; // 파일경로명지정 }; 상기의소켓주소정보구조체를이용하여 bind() 시스템콜을호출하면지정된경로명의파일이생성 소켓사용을종료한후에는 unlink() 시스템콜을이용하여제거 파일이존재할경우, 같은경로명으로바인딩할수없음 Linux System Programming 22

소켓이름설정 : bind() 소켓시스템콜 (6) INET 도메인에서소켓이름지정 #include <netinet/in.h> struct sockaddr_in { sa_family_t sin_family; // PF_INET 지정 u_int16_t sin_port; // port 번호지정 struct in_addr sin_addr; // IP 주소지정 }; Struct in_addr { u_int32_t s_addr; }; // IP 주소 Linux System Programming 23

소켓시스템콜 (7) 소켓이름설정 : bind() INET 도메인에서소켓이름지정 Port 번호 16 비트정수 / 0~65535 0~1023 : Well-known ports 1024~49151 : Reserved ports 49152~65535 : User-free ports getservbyname() - 서비스이름으로 port 번호찾기 IP 주소 점으로구분된 10진수표기 IP 주소를정수값으로변환한뒤에네트워크바이트순서로지정 예 : 172.16.85.4 172*256^3+16*256^2+85*256+4 2886751492 0xac155504 inet_addr() / inet_ntoa() 주소변환함수 htons(), htonl(), ntohs(), ntohl() 호스트바이트순서와네트워크바이트순서상호간의변환 (h: host, n: network, s: short, l: long) Linux System Programming 24

소켓시스템콜 (8) 소켓연결요청발신 : connect() #include <sys/types.h> #include <sys/socket.h> int connect(int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen) /* int sockfd: 소켓파일디스크립터 */ /* const struct sockaddr *serv_addr : 서버의소켓주소정보구조체에대한포인터 */ /* socklen_t addrlen : 서버소켓주소정보구조체의길이 */ /* 정상종료하면 0 을반환하고, 에러가발생한경우에는 -1 를반환한다. 외부변수 errno 에에러를나타내는값을설정한다 */ 스트림소켓을사용하는경우, 클라이언트프로세스가서버프로세스에게연결요청을보내기위해사용 파라미터에연결하는서버프로세스의소켓주소를지정 Linux System Programming 25

소켓시스템콜 (9) INET 도메인에서소켓주소정보설정방법 INET 도메인의소켓주소정보설정 #include <netinet/in.h> struct sockaddr_in server; bzero((void *)&server, sizeof(server)); server.sin_familiy = PF_INET; server.sin_port = htons(port-number); server.sin_addr.s_addr = htonl(ip-address); Linux System Programming 26

소켓시스템콜 (10) INET 도메인에서소켓주소정보설정방법 ( 계속 ) IP 주소가바이너리 ( 정수값 ) 인경우 htonl() 함수를사용하여네트워크바이트순서로변환하여지정 예 : server.sin_addr.s_addr = htonl(0xac105504); IP 주소가점으로구분된 10 진수인경우 in_addr() or in_aton() 함수를이용하여 10진수 IP 주소를네트워크바이트순서의바이너리형식으로변환하여지정 예 : server.sin_addr.s_addr = in_addr( 172.16.85.4 ); or in_aton( 172.16.85.4, (struct in_addr *)&server.sin_addr.s_addr); Linux System Programming 27

소켓시스템콜 (10) INET 도메인에서소켓주소정보설정방법 ( 계속 ) IP 주소가아닌호스트이름인경우 호스트이름을이용하여 IP 주소를찾은후에지정 // netdb.h struct hostent { char *h_name; char **h_aliases; int h_addrtype; int h_length; char **h_addr_list; }; #define h_addr h_addr_list[0] #include <netdb.h> struct hostent *hp; // 호스트이름 // 호스트별칭배열 // 주소타입 (PF_INET) // 주소길이 // IP 주소배열 1. /etc/hosts 파일을검색 2. DNS 서버에질의 if ((hp = gethostbyname( carrot )) == NULL) { perror( gethostbyname ); exit(1); } bcopy(hp->h_addr, (char *)&server.sin_addr.s_addr, hp->h_length); Linux System Programming 28

소켓시스템콜 (11) INET 도메인에서소켓주소정보설정방법 ( 계속 ) 자기호스트의주소정보를설정하는경우 자신의호스트이름을얻은후에 IP 주소로변환하여지정 #include <netdb.h> #include <unistd.h> #define HOST_NAME_SIZE 256 #define ERR -1 char hostname[host_name_size]; struct hostent *hp; if (gethostname(hostname, HOST_NAME_SIZE) == ERR) { perror(gethostname); exit(1); } if ((hp = gethostbyname(hostname)) == NULL) { perror( gethostbyname ); exit(1); } bcopy(hp->h_addr, (char *)&server.sin_addr.s_addr, hp->h_length); Linux System Programming 29

소켓시스템콜 (12) INET 도메인에서소켓주소정보설정방법 ( 계속 ) 자기호스트의특수주소정보를사용하는경우 서버프로세스가자신의소켓에대해바인딩하는경우 INET 도메인을이용하여로컬통신하기위해클라이언트프로세스에연결하는경우 특수주소 INADDR_ANY(= 0.0.0.0) 을사용 예 : server.sin_addr.s_addr = htonl(inaddr_any); Linux System Programming 30

소켓시스템콜 (13) 소켓연결요청수락준비 : listen() #include <sys/types.h> #include <sys/socket.h> int listen(int sockfd, int backlog) /* int sockfd: 소켓파일디스크립터 */ /* int backlog: 연결요청에대한대기행렬의최대길이 */ /* 정상종료하면 0 을반환하고, 에러가발생한경우에는 -1 를반환한다. 외부변수 errno 에에러를나타내는값을설정한다 */ 스트림소켓을사용하는경우, 서버프로세스가지정된소켓에대한연결요청이도착할것임을 UNIX 시스템에통지하기위해사용 지정된소켓에대해최대연결가능한요청수를지정 Linux System Programming 31

소켓시스템콜 (14) 소켓연결요청허가 : accept() #include <sys/types.h> #include <sys/socket.h> int accept(int sockfd, struct sockaddr *client_addr, socklen_t *addrlen) /* int sockfd: 소켓파일디스크립터 */ /* struct sockaddr *client_addr : 클라이언트의소켓주소정보구조체에대한포인터 */ /* socklen_t addrlen : 클라이언트소켓주소정보구조체의길이 */ /* 정상종료하면소켓에대한새로운파일디스크립터를반환하고, 에러가발생한경우에는 -1 를반환한다. 외부변수 errno 에에러를나타내는값을설정한다 */ 스트림소켓을사용하는경우, 서버프로세스가클라이언트프로세스의연결요청을허가해주기위해사용 Linux System Programming 32

소켓시스템콜 (15) 소켓연결요청허가 : accept() 클라이언트프로세스에서연결요청이들어올때까지서버프로세스를블로킹 (blocking) 클라이언트프로세스의연결요청이도착하면새로운파일디스크립터를반환 클라이언트프로세스와의통신에사용 소켓에대한이전의파일디스크립터는다른클라이언트의연결요구를계속대기한다 클라이언트연결요청을허가한다음, 클라이언트프로세스의소켓주소와그주소의길이정보를파라미터를통해반환한다 서버프로세스가클라이언트를식별 Linux System Programming 33

소켓시스템콜 (16) 스트림소켓을이용한데이터송신 : send() #include <sys/types.h> #include <sys/socket.h> int send(int sockfd, const void *buf, size_t len, int flags) /* int sockfd: 소켓파일디스크립터 */ /* const void *buf: 송신버퍼의주소 */ /* size_t len: 송신데이터의길이 */ /* int flags: 송신옵션 */ /* 정상종료하면실제송신된데이터수를반환하고, 에러가발생한경우에는 -1 를반환한다. 외부변수 errno 에에러를나타내는값을설정한다 */ 스트림소켓을통해데이터를송신 write() 시스템콜을이용하여데이터송신가능 Linux System Programming 34

소켓시스템콜 (17) 스트림소켓을이용한데이터송신 : send() send() 시스템콜에서의송신옵션 송신옵션 MSG_OOB MSG_DONTROUTE MSG_DONTWAIT MSG_NOSIGNAL 설명 비대역 (out-of-band) 데이터 ( 긴급하게송신하여야하는데이터 ) 를지원하는소켓으로비대역데이터를보낸다 패킷을보낼때에게이트웨이를사용하지않고직접네트워크로접속하고있는호스크에게만보낸다 비블록조작을유효하게한다 스트림소켓으로상대편이접속을끊은경우, 에러로 SIGPIPE 를만들지않도록요구한다 Linux System Programming 35

소켓시스템콜 (18) 스트림소켓을이용한데이터수신 : recv() #include <sys/types.h> #include <sys/socket.h> int recv(int sockfd, void *buf, size_t len, int flags) /* int sockfd: accept() 에서반환된소켓파일디스크립터 */ /* void *buf: 수신버퍼의주소 */ /* size_t len: 수신버퍼의길이 */ /* int flags: 수신옵션 */ /* 정상종료하면실제수신된데이터수를반환하고, 에러가발생한경우에는 -1 를반환한다. 외부변수 errno 에에러를나타내는값을설정한다 */ 스트림소켓을통해데이터를수신 받은데이터가없는경우에데이터가도착할때까지정지상태로대기 일부데이터가수신되면반환 소켓의 O_NOBLOCK 플래그가설정되어있는경우는 -1를반환 read() 시스템콜를통해데이터수신가능 36

소켓시스템콜 (19) 스트림소켓을이용한데이터수신 : recv() recv() 시스템콜에서의수신옵션 송신옵션 MSG_OOB MSG_PEEK MSG_WAITALL MSG_NOSIGNAL 설명 비대역 (out-of-band) 데이터 ( 긴급하게송신하여야하는데이터 ) 를받을것을요구 수신대기행렬의최초데이터를반환할때대기행렬로부터데이터를없애지않는다. 따라서이후의 recv() 호출에대해같은데이터를반환 요구한최대량의데이터가도착할때까지조작을정지하도록요구 스트림소켓으로상대편이접속을끊은경우, 에러로 SIGPIPE 를만들지않도록요구 Linux System Programming 37

소켓시스템콜 (20) 데이터그램소켓을이용한데이터송신 : sendto() #include <sys/types.h> #include <sys/socket.h> int sendto(int sockfd, const void *buf, size_t len,int flags, const struct sockaddr *to, socklen_t tolen) /* int sockfd: 소켓파일디스크립터 */ /* const void *buf: 송신버퍼의주소 */ /* size_t len: 송신데이터의길이 */ /* int flags: 송신옵션 */ /* const struct sockaddr *to: 수신소켓의주소정보구조체의주소 */ /* socklen_t tolen : 수신소켓의주소정보구조체의길이 */ /* 정상종료하면실제송신된데이터수를반환, 에러가발생한경우에는 -1 를반환. 외부변수 errno 에에러를나타내는값을설정한다 */ Linux System Programming 38

소켓시스템콜 (21) 데이터그램소켓을이용한데이터송신 : sendto() 데이터그램소켓은비연결지향 (connectionless) 클라이언트프로세스에서의 connect() 호출, 서버프로세스에서의 listen() 호출이필요없음 데이터를송신할때에데이터수신측의주소를매번지정 Linux System Programming 39

소켓시스템콜 (22) 데이터그램소켓을이용한데이터수신 : recvfrom() #include <sys/types.h> #include <sys/socket.h> int recvfrom(int sockfd, void *buf, size_t len,int flags, struct sockaddr *from, socklen_t fromlen) /* int sockfd: 소켓파일디스크립터 */ /* void *buf: 수신버퍼의주소 */ /* size_t len: 수신버퍼의길이 */ /* int flags: 수신옵션 */ /* struct sockaddr *from: 송신측의소켓주소정보구조체의주소 */ /* socklen_t fromlen: 송신측의소켓주소정보구조체의길이 */ /* 정상종료하면실제송신된데이터수를반환, 에러가발생한경우에는 -1 를반환. 외부변수 errno 에에러를나타내는값을설정한다 */ 데이터그램소켓을통해전송된데이터를읽어온다 마지막두개의파라미터를통해데이터를전송한소켓의주소를읽어올수있다 Linux System Programming 40

소켓시스템콜 (23) 데이터그램소켓관련추가시스템콜 int sendmsg(int s, const struct msghdr *msg, int flags) int recvmsg(int s, struct msghdr *msg, int flags) sendto() & recvfrom() 와같이데이터그램소켓을이용하여데이터를송수신하는시스템콜 인자수를줄이기위해두번째인자에 msghdr 구조체를정의하여사용 Linux System Programming 41

네트워크라이브러리 (1) 바이트순서변환라이브러리함수 호스트바이트순서와네트워크바이트순서사이의변환을지원 #include <netinet/in.h> uint32_t htonl(uint32_t hostlong); /* 4 바이트데이터를호스트바이트순서에서네트워크바이트순서로변환 */ uint16_t htons(uint16_t hostlong); /* 2 바이트데이터를호스트바이트순서에서네트워크바이트순서로변환 */ uint32_t ntohl(uint32_t netlong); /* 4 바이트데이터를네트워크바이트순서에서호스트바이트순서로변환 */ uint16_t ntohs(uint16_t netlong); /* 2 바이트데이터를네트워크바이트순서에서호스트바이트순서로변환 */ Linux System Programming 42

네트워크라이브러리 (2) IP 주소조작라이브러리함수 #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_aton(const char *cp, struct in_addr *inp); /* 점으로구분된 10 진수형식의 IP 주소를네트워크바이트순서의이진수형식 IP 주소로변환 */ in_addr_t inet_addr(const char *cp); /* 점으로구분된 10 진수형식의 IP 주소를네트워크바이트순서의이진수형식 IP 주소로변환 */ in_addr_t inet_network(const char *cp); /* 점으로구분된 10 진수형식의 IP 주소에서네트워크부분만을분리하여호스트바이트순서로반환 */ char * inet_ntoa(struct in_addr in); /* 네트워크바이트순서의이진 IP 주소를점으로구분한 10 진수표기로변환 */ Linux System Programming 43

네트워크라이브러리 (3) IP 주소조작라이브러리함수 ( 계속 ) #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> struct in_addr inet_makeaddr(int net, int host); /* 호스트바이트순서의네트워크부분과호스트부분을결합하여네트워크바이트순서의 IP 주소로반환 */ in_addr_t inet_lnaof(struct in_addr in); /* 네트워크바이트순서의이진 IP 주소에서호스트부분을분리하여호스트바이트순서로변환 */ in_addr_t inet_netof(struct in_addr in); /* 네트워크바이트순서의이진 IP 주소에서네트워크부분을분리하여호스트바이트순서로변환 */ Linux System Programming 44

네트워크라이브러리 (4) IP 주소조작라이브러리함수 ( 계속 ) IPv6 으로의확장 여러개의주소패밀리를지원 AF_INET / AF_INET6 #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int inet_pton(int af, const charn *src, void *dst); char *inet_ntop(int af, const charn *src, void *dst, size_t cnt); Linux System Programming 45

네트워크라이브러리 (5) 바이트열조작라이브러리함수 #include <string.h> int bcmp(const void *s1, const void *s2, int n); /* 바이트열의비교 */ int bcopy(const void *s1, void *s2, int n); /* 바이트열의복사 */ int bzero(void *s, int n); /* 바이트열의초기화 */ 바이트열조작함수의비교 bcmp() memcmp() strcmp(), strncmp() bcopy() memcpy(), memccpy() strcpy(), strncpy() bzero() memset Linux System Programming 46

네트워크라이브러리 (6) 네트워크설정파일참조라이브러리함수 네트워크설정관련파일 /etc/hosts 호스트이름과 IP 주소대응표 /etc/protocols 프로토콜이름과프로토콜번호의대응표 /etc/services 서비스이름과포트번호, 프로토콜번호의대응포 /etc/networks 네트워크이름과네트워크주소의대응표 네트워크에서호스트엔트리를얻음 (/etc/hosts) gethostbyname() 호스트이름으로호스트정보를얻음 gethostbyaddr() IP 주소와일치하는호스트정보를얻음 sethostent() 네임서버에보내는접속양식설정 endhostent() 네임서버접속을끝냄 herror() 에러메시지를 stderr로보냄 hstrerror() 에러메시지를돌려줌 Linux System Programming 47

네트워크라이브러리 (7) 네트워크설정파일참조라이브러리함수 ( 계속 ) 프로토콜엔트리를얻음 (/etc/protocols) getprotoent() 파일의다음행에서프로토콜정보를얻음 getprotobyname() 프로토콜이름으로프로토콜정보를얻음 getprotobynumber() 프로토콜번호로프로토콜정보를얻음 setprotoent() 파일을열어파일포인터를가장앞으로이동 endprotoent() 파일닫음 서비스엔트리를얻음 (/etc/services) getservent() 파일의다음행에서서비스정보를얻음 getservbyname() 서비스이름으로서비스정보를얻음 getservbyport() 포트번호로서비스정보를얻음 setservent() 파일을열어파일포인터를가장앞으로이동 endservent() 파일닫음 Linux System Programming 48

네트워크라이브러리 (8) 네트워크설정파일참조라이브러리함수 ( 계속 ) 네트워크엔트리를얻음 (/etc/networks) getinetent() 파일의다음행에서네트워크정보를얻음 getinetbyname() 네트워크이름과일치하는행에서서비스정보를얻음 getinetbyport() 포트번호와일치하는행에서서비스정보를얻음 setinetent() 파일을열어파일포인터를가장앞으로이동 endinetent() 파일닫음 Linux System Programming 49

스트림소켓을이용한통신 (1) 스트림소켓을이용한동기통신 UNIX 도메인 INET 도메인 반복서버 병행서버 Linux System Programming 50

스트림소켓을이용한통신 (2) 스트림소켓을이용한비동기통신 Linux System Programming 51

데이터그램소켓을이용한통신 (1) INET 도메인에서의동기통신 Linux System Programming 52

데이터그램소켓을이용한통신 (2) 브로드캐스팅 Linux System Programming 53