1 / 21

Chapter 13. Advanced I / O Functions

Chapter 13. Advanced I / O Functions. 13.1 Introduction. Socket Timeouts recv and send Functions readv and writev Functions recvmsg and sendmsg Function Ancillary Data How much Data is Queued? Sockets and Standard I/O T/TCP. 13.2 Socket Timeouts.

Download Presentation

Chapter 13. Advanced I / O Functions

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Chapter 13. Advanced I / O Functions UNIX Network Programming

  2. 13.1 Introduction • Socket Timeouts • recv and send Functions • readv and writev Functions • recvmsg and sendmsg Function • Ancillary Data • How much Data is Queued? • Sockets and Standard I/O • T/TCP UNIX Network Programming

  3. 13.2 Socket Timeouts • Three ways to place a timeout on an I/O operation involving a socket • Call alarm, which generates the SIGALRM signal when the specified time has expired. • Block waiting for I/O in select, which has a time limit built in, instead of blocking in a call to read or write. • Use the newer SO_RCVTIMEO and SO_SNDTIMEO socket options. UNIX Network Programming

  4. Connect with a Timeout Using SIGALRM (figure 13.1) #include "unp.h" static void 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"); 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 the connect() */ } UNIX Network Programming

  5. recvfrom with a Timeout Using SIGALRM (figure 13.2) #include "unp.h" static void sig_alrm(int); void dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) { int n; char sendline[MAXLINE], recvline[MAXLINE + 1]; 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() */ } UNIX Network Programming

  6. recvfrom with a Timeout Using select (figure 13.3) #include "unp.h" int readable_timeo(int fd, int sec) { fd_set rset; struct timeval tv; FD_ZERO(&rset); 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 */ } UNIX Network Programming

  7. recvfrom with a Timeout Using the SO_RCVTIMEO Socket Option (figure 13.5) 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); } } UNIX Network Programming

  8. 13.3 recv and send Functions #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); UNIX Network Programming

  9. 13.4 readv and writev Functions • readv and writev let us read into or write from one or more buffers with a single function call. • are called scatter read and gather 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 */ }; UNIX Network Programming

  10. 13.5 recvmsg and sendmsg Functions #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; /* starting address of buffer */ 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() */ }; UNIX Network Programming

  11. 13.5 recvmsg and sendmsg Functions (cont.) UNIX Network Programming

  12. 13.5 recvmsg and sendmsg Functions (cont.) UNIX Network Programming

  13. 13.5 recvmsg and sendmsg Functions (cont.) UNIX Network Programming

  14. 13.6 Ancillary Data • Ancillary data can be sent and received using the msg_control and msg_controllen members of the msghdr structure with sendmsg and recvmsg functions. UNIX Network Programming

  15. 13.6 Ancillary Data (cont.) UNIX Network Programming

  16. 13.6 Ancillary Data (cont.) UNIX Network Programming

  17. 13.7 How Much Data Is Queued? • Three techniques - page 365. UNIX Network Programming

  18. 13.8 Sockets and Standard I/O • The standard I/O stream can be used with sockets, but there are a few items to consider. • A standard I/O stream can be created from any desciptor by calling the fdopen function. Similarly, given a standard I/O stream, we can obtain the corresponding descriptor by calling fileno. • fseek, fsetpos, rewind functions is that they all call lseek, which fails on a socket. • The easiest way to handle this read-write problem is to open two standard I/O streams for a given socket: one for reading, and one for writing. UNIX Network Programming

  19. 13.8 Sockets and Standard I/O • Example : str_echo Function using standard I/O #include "unp.h" void str_echo(int sockfd) { char line[MAXLINE]; FILE *fpin, *fpout; fpin = Fdopen(sockfd, "r"); fpout = Fdopen(sockfd, "w"); for ( ; ; ) { if (Fgets(line, MAXLINE, fpin) == NULL) return; /* connection closed by other end */ Fputs(line, fpout); } } UNIX Network Programming

  20. 13.9 T/TCP: TCP for Transactions • T/TCP is a slight modification to TCP that can avoid the three-way handshake between hosts that have communicated with each other recently. • Benefit • all the reliability of TCP is retained • maintains TCP’s slow start and congestion avoidance, features that are often missing from UDP applications. UNIX Network Programming

  21. 13.9 T/TCP: TCP for Transactions (cont.) UNIX Network Programming

More Related