Unix Network Programming Chapter 4. Elementary TCP Sockets

Similar documents
슬라이드 1

The Pocket Guide to TCP/IP Sockets: C Version

The Pocket Guide to TCP/IP Sockets: C Version

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

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

Microsoft PowerPoint - Lecture_Note_5.ppt [Compatibility Mode]

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

슬라이드 1

슬라이드 1

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

Microsoft Word - Network Programming_NewVersion_01_.docx

Microsoft PowerPoint - 04-UDP Programming.ppt

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

The OSI Model

chap7.key

제1장 Unix란 무엇인가?

vi 사용법

본 강의에 들어가기 전

6주차.key

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

Microsoft PowerPoint APUE(File InO).pptx

Chapter #01 Subject

K&R2 Reference Manual 번역본

The Pocket Guide to TCP/IP Sockets: C Version

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

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

제1장 Unix란 무엇인가?

2009년 상반기 사업계획

본 강의에 들어가기 전

The Pocket Guide to TCP/IP Sockets: C Version

bn2019_2

Microsoft PowerPoint APUE(Intro).ppt

untitled

슬라이드 1

슬라이드 1

슬라이드 1

Microsoft PowerPoint - polling.pptx

11장 포인터

Microsoft Word doc

Chapter 4 UDP 소켓 사용법

SRC PLUS 제어기 MANUAL

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint APUE(File InO).ppt

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

PowerPoint 프레젠테이션

13주-14주proc.PDF

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

Chap06(Interprocess Communication).PDF

좀비프로세스 2

PowerPoint 프레젠테이션

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

Microsoft PowerPoint - 09-Pipe

SYN flooding

KEY 디바이스 드라이버

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

1217 WebTrafMon II

제1장 Unix란 무엇인가?


Microsoft PowerPoint APUE(File InO)

03장.스택.key

슬라이드 1

Chap04(Signals and Sessions).PDF

BMP 파일 처리


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

PowerPoint 프레젠테이션

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

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

TCP.IP.ppt

PowerPoint 프레젠테이션

제12장 파일 입출력

10.

Embeddedsystem(8).PDF

슬라이드 1

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

일반적인 네트워크의 구성은 다음과 같다

<4D F736F F F696E74202D20C1A63137C0E520B5BFC0FBB8DEB8F0B8AEBFCD20BFACB0E1B8AEBDBAC6AE>

untitled

Computer Programming (2008 Fall)

5. 소켓 프로그래밍

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

Microsoft PowerPoint - chap4 [호환 모드]

2002년 2학기 자료구조

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

ABC 11장

hd1300_k_v1r2_Final_.PDF

chap 5: Trees

Microsoft PowerPoint - chap06-2pointer.ppt

歯9장.PDF

제1장 Unix란 무엇인가?

API 매뉴얼

PowerPoint 프레젠테이션

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

<C0CCBCBCBFB52DC1A4B4EBBFF82DBCAEBBE7B3EDB9AE2D D382E687770>

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

Microsoft PowerPoint - Lecture_Note_2.ppt [Compatibility Mode]

<4D F736F F F696E74202D BDC3B1D7B3CEB0FA20BDC3B1D7B3CE20C3B3B8AE2E707074>

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

본 강의에 들어가기 전

Transcription:

Unix Network Programming Chapter 14. Advanced I/O Functions 광운대학교컴퓨터과학과 정보통신연구실 석사과정안중현

14.1 Introduction 이장에서소개되고있는내용 I/O operation 에서 timeout 을설정하는세가지방법 세가지 Read/Write 관련함수 recv/send readv/writev recvmsg/sendmsg Ancillary data Socket receive buffer 에서얼마나많은데이터를받을지알아내는방법 소켓에서 C 표준 I/O 라이브러리를사용하는방법 이벤트를기다리기위한좀더진보된방식 2

14.2 Socket Timeouts Socket timeout 을설정하는방법 SIGALRM signal 발생시켜 alarm 호출 정해진시간이끝나면 SIGALRM signal 발생시킴. 다른 signal 과구분하기위한 signal handling 포함 프로세스에서발생하는다른 alarm 에의해영향을받음 select 입출력 Block read write 호출을 blocking 하는대신에시간제한을둔 select 에서입출력을기다리는것을막음 새로운 SO_RCVTIMEO 와 SO_SNDTIMEO 소켓옵션사용 구현시소켓옵션을지원하지않을수있다는문제점 3

Connect with a Timeout Using SIGALRM #include static void "unp.h" connect_alarm(int); int connect_timeo(int sockfd, const SA *saptr, socklen_t salen, int nsec) { Sigfunc *sigfunc; int n; sigfunc = Signal(SIGALRM, connect_alarm); if (alarm(nsec)!= 0) err_msg("connect_timeo: alarm was already set"); 지정한시간이지나면 connect 를호출하는함수 if ( (n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0) { close(sockfd); if (errno == EINTR) errno = ETIMEDOUT; alarm(0); /* turn off the alarm */ Signal(SIGALRM, sigfunc); /* restore previous signal handler */ return(n); static void connect_alarm(int signo) { return; /* just interrupt 4 the connect() */

Connect with a Timeout Using SIGALRM // 현재 signal handler 를저장 sigfunc = Signal(SIGALRM, connect_alarm); // 지정한시간만큼알람설정. nsec 는설정시간 if (alarm(nsec)!= 0) err_msg("connect_timeo: alarm was already set"); // connect 실패시 (-1 리턴 ) 소켓을닫고, 인터럽트걸렸을경우 errono 값을 ETIMEDOUT 으로변경 if ( (n = connect(sockfd, (struct sockaddr *) saptr, salen)) < 0) { close(sockfd); if (errno == EINTR) errno = ETIMEDOUT; // 알람을끄고이전 signal handler로복구 alarm(0); /* turn off the alarm */ Signal(SIGALRM, sigfunc); /* restore previous signal handler */ // signal 처리 connect_alarm(int signo) { return; /* just interrupt the connect() */ 5

recvfrom with a Timeout Using SIGALRM #include static void "unp.h" sig_alrm(int); void dg_cli(file *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n; char sendline[maxline], recvline[maxline + 1]; 5 초내에응답이없으면 recvfrom 을일시중지시키는 alarm 함수를호출 Signal(SIGALRM, sig_alrm); while (Fgets(sendline, MAXLINE, fp)!= NULL) { Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); alarm(5); if ( (n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) { if (errno == EINTR) fprintf(stderr, "socket timeout n"); else err_sys("recvfrom error"); else { alarm(0); recvline[n] = 0; /* null terminate */ Fputs(recvline, stdout); static void sig_alrm(int signo) { return; /* just interrupt the recvfrom() */ 6

recvfrom with a Timeout Using SIGALRM // SIGALRM 을위한 signal handler 를설정 Signal(SIGALRM, sig_alrm); while (Fgets(sendline, MAXLINE, fp)!= NULL) { Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); // recvfrom 을호출하기전 5 초간기다림 alarm(5); if ( (n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL)) < 0) { // 만약일시중지된다면에러메시지출력 if (errno == EINTR) fprintf(stderr, "socket timeout n"); else err_sys("recvfrom error"); else { // 서버로부터데이터를받으면 alarm 을해제하고받은데이터출력 alarm(0); recvline[n] = 0; /* null terminate */ Fputs(recvline, stdout); // recvform 을일시중지시키기위해사용 static void sig_alrm(int signo) { return; /* just interrupt the recvfrom() */ 7

recvfrom with a Timeout Using select #include "unp.h" int readable_timeo(int fd, int sec) { fd_set rset; struct timeval tv; FD_ZERO(&rset); // 파일디스크립터집합의모든비트를 0으로 FD_SET(fd, &rset); // tv.tv_sec = sec; tv.tv_usec = 0; 읽기가가능해질때까지지정한시간만큼기다림 // 파일디스크립터개수혹은에러리턴 return(select(fd+1, &rset, NULL, NULL, &tv)); /* 4> 0 if descriptor is readable */ 8

recvfrom with a Timeout Using select #include "unp.h 그림 8.8에 Readable_timeo를추가한프로그램 voiddg_cli(file *fp, int sockfd, const SA *pservaddr, socklen_t servlen){ int n; char sendline[maxline], recvline[maxline + 1]; while (Fgets(sendline, MAXLINE, fp)!= NULL) { Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); if (Readable_timeo(sockfd, 5) == 0) { fprintf(stderr, "socket timeout n"); else { n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL); recvline[n] = 0; /* null terminate */ Fputs(recvline, stdout); 9

recvfrom with a Timeout Using the SO_RCVTIMEO Socket Optioin void dg_cli(file *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n; char sendline[maxline], recvline[maxline + 1]; struct timeval tv; tv.tv_sec = 5; tv.tv_usec = 0; Setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); while (Fgets(sendline, MAXLINE, fp)!= NULL) { Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen); n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL); if (n < 0) { if (errno == EWOULDBLOCK) { fprintf(stderr, "socket timeout n"); continue; else err_sys("recvfrom error"); recvline[n] = 0; /* null terminate */ Fputs(recvline, stdout); 10

recvfrom with a Timeout Using the SO_RCVTIMEO Socket Optioin // SO_REVTIMEO 는읽기에만해당. 쓰기는 SO_SNDTIMEO. // tv 에지정된시간만큼기다림. Setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); // I/O 시간이만료되면, EWOULDBLOCK을 errno로지정하고에러메세지출력 n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL); if (n < 0) { if (errno == EWOULDBLOCK) { fprintf(stderr, "socket timeout n"); continue; else err_sys("recvfrom error"); 11

14.3 recv and send Functions 표준함수 read, write 와유사하나인수가하나더필요 #include <sys/socket.h> ssize_t recv (int sockfd, void *buff, size_t nbytes, int flags); ssize_t send (int sockfd, const void *buff, size_t nbytes, int flags); 3 번째인수까지는같음 4 번째인수값 Flags Description recv send MSG_DONTROUTE MSG_DONTWAIT MSG_OOB MSG_PEEK MSG_WAITALL bypass routing table lookup only this operation is nonblocking send or receive out-of-band data peek at incoming message wait for all the data 그림Figure 14.613.6 flags for I/O functions 12

14.3 recv and send Functions MSG_DONTROUTE: kernal 에게 routing table 을살펴볼필요가없음을알림. MSG_DONTWAIT: I/O 에대하여 nonblocking 을설정하지않고, I/O 를수행하며, nonblocking 표시기를해제함을나타낸다. MSG_OOB: out-of-band 에서데이터송신을지정한다. MSG_PEEK: recv 나 recvfrom 에서리턴후데이터를버리지않고살펴볼수있게한다. MSG_WAITALL: kernal 에요구한바이트만큼읽기전에 return 되지말것을지시한다. 13

14.4 readv and writev Functions read, write 와유사하나한번호출로메모리에흩어져있는버퍼로부터읽고쓸수있다. #include <sys/uio.h> ssize_t readv (int filedes, const struct iovec *iov, int iovcnt); ssize_t writev (int filedes, const struct iovec *iov, int iovcnt); Struct iovec { void *iov_base; /* starting address of buffer */ size_t iov_len; /* size of buffer */ ; 14

14.5 recvmsg and sendmsg Functions 입출력함수의가장일반적인형태로 read, readv, recv, recvfrom 을 recvmsg 로대체할수있다. 이함수는대부분의인수를 msghdr 에통합시켰다. #include <sys/socket.h> ssize_t recvmsg (int sockfd, struct msghdr *msg, int flags); ssize_t sendmsg (int sockfd, struct msghdr *msg, int flags); Struct msghdr { void *msg_name; /* protocol address */ ; socklen_t msg_namelen; /* size of protocol address */ struct iovec *msg_iov; /* scatter/gather array */ size_t msg_iovlen; /* # elements in msg_iov */ void *msg_control; /* ancillary data; must be aligned for a cmsghdr structure */ socklen_t msg_controllen;/* length of ancillary data */ int msg_flags; /* flags returned by recvmsg() */ 15

14.5 recvmsg and sendmsg Functions msghdr Msg_name 목적지나송신자의프로토콜주소를저장 Recvfrom 과 sendto 의다섯번째와여섯번째인수 주소가지정될필요가없다면 NULL pointer 로 msg_namelen 프로토콜주소의크기 Msg_iov 와 msg_iovlen 입력또는출력버퍼배열을지정. Msg_control 과 msg_controllen 부수적인데이터 (ancillary data) 의위치와크기지정. Msg_flags Msg_flag recvmsg 만사용 Recvmsg 를호출하면 flags 인수는 msg_flags 로복사된다 Msg_flag 는 sendmsg 에서무시된다. 16

14.5 recvmsg and sendmsg Functions Flag MSG_DONTROUTE MSG_DONTWAIT MSG_PEEK MSG_WAITALL MSG_EOR MSG_OOB MSG_BCAST MSG_MCAST MSG_TRUNC MSG_CTRUNC Examined by: Send flags Sendto flags Sendmsg flags Examined by: recv flags recvfrom flags recvmsg flags Returned by: Recvmsg msg_flags 그림 14.7 Figure Summary 13.7 Summary of input of and output flags flags by various by various I/O functions I/O functions 17

14.5 recvmsg and sendmsg Functions 처음네게 flag 는검사될뿐리턴되지않는다. MSG_BCAST: 이 flag 는 BSD/OS 에서새로운것으로링크레이어에서브로드케스트로받다진다면리턴된다. MSG_MCAST: 이 flag 는 BSD/OS 에서새로운것으로데이터그램이링크레이어의멀티케스트로서받아진다면리턴된다. MSG_TRUNC: 이플러그는데이터그램이잘려진다면리턴된다. MSG_CTRUNC: 이플러그는부수적데이터가잘려진다면리턴된다. MSG_EOR: 리턴된데이터가논리적데이터끝이아니면해제된다. MSG_OOB: 이것은 TCP out-of-band 데이터에서절대리턴되지않는다. 18

14.5 recvmsg and sendmsg Functions 프로세스가 UDP 소켓에대해 recvmsg 함수를호출하려는때의데이터구조 msghdr{ msg_name msg_namelen 16 iovec{ msg_iov msg_iovlen 3 iov_base iov_len 100 msg_control msg_controllen msg_flags 20 0 iov_base iov_len iov_base iov_len 60 80 Figure 13.8 Data structures when recvmsg 19 is called for a socket. 14.8 Data structures when recvmsg is called for a UDP

14.5 recvmsg and sendmsg Functions 198.69.10.2에서 206.62.226.35로 170 바이트를보낼때데이터 sockaddr_in{ 16, AF_INET, 2000 198.69.10.2 msghdr{ msg_name msg_namelen msg_iov msg_iovlen msg_control msg_controllen msg_flags 16 3 16 0 iovec{ [] iov_base iov_len iov_base iov_len iov_base iov_len 100 60 80 cmsg_len cmsg_level cmsg_type 16 IPPROTP_IP IP_RECVDSTADDR 206.62.226.35 20 그림 14.9 Update of Figure 14.8 when recvmsg returns

14.6 Ancillary Data Ancillary data 는 sendmsg 와 recvmsg 함수로 msghdr 구조원소를사용하여송수신할수있다 제어정보라고도한다 struct cmsghrd { socklen_t cmsg_len; int cmsg_level; int cmsg_type; // 이구조체의길이 // 전송측프로토콜 // 프로토콜세부타입 Protocol cmsg_level Cmsg_type Description IPv4 IPPROTO_IP IP_RECVDSTADDR receive destination address with UDP datagram IP_RECVIF receive interface index with UDP datagram IPv6 IPPROTO_IPV6 IPV6_DSTOPTS IPV6_HOPLIMIT IPV6_HOPOPTS IPV6_NEXTHOP IPV6_PKTINFO IPV6_RTHDR specify / receive destination options specify / receive hop limit specify / receive hop-by-hop options specify next-hop address specify / receive packet information specify / receive routing header Unix domain SOL_SOCKET SCM_RIGHTS SCM_CREDS send / receive descriptors send / receive user credentials Figure 14.11 summary of uses 21 for ancillary data.

14.6 Ancillary Data msg_control msg_controllen cmsg_len CMSG_LEN() cmsg_len CMSG_LEN() cmsg_len cmsg_level cmsg_type pad data pad cmsg_len cmsg_level cmsg_type pad data cmsghdr{ cmsghdr{ accillary data object CMSG_SPACE() accillary data object CMSG_SPACE() 22 Figure 14.12 Ancillary data containing two ancillary data objects.

14.6 Ancillary Data #include <sys/socket.h> #include <sys/param.h> /* for ALIGN macro on many implementations */ struct cmsghdr *CMSG_FIRSTHDR(struct msghdr * mhdrptr ); struct cmsghdr *CMSG_NXTHDR(struct msghdr *mhdrptr, struct cmsghdr *cmsgptr ); unsigned char *CMSG_DATA(struct cmsghdr *cmsgptr ); unsigned int CMSG_LEN(unsigned int length); unsigned int CMSG_SPACE(unsigned intlength ); 23

14.7 How much Data Is Queued? 얼마나많은큐가있는지데이터를읽지않고아는세가지방법. 다른일을하려고하기때문에목적이 kernel 에서 block 하는것아니면 15 장에서설명 읽기를원하며프로세스다른쪽에서데이터를읽을수있도록수신대기열에남겨두기원한다면 mgs_peek 를사용한다. 여러 implementation 은 ioctl FIONREAD 의 command 를지원한다. 24

14.8 Sockets and Standard I/O 25