[ Team LiB ] Previous Section Next Section

Chapter 24

24.1

Yes, in the first example, 2 bytes are sent with a single urgent pointer that points to the byte following the b. But in the second example (the two function calls), first the a is sent with an urgent pointer that points just beyond it, and this is followed by another TCP segment containing the b with a different urgent pointer that points just beyond it.

24.2

24.2 Figure E.16 shows the version using poll.

Figure E.16 Version of Figure 24.6 using poll instead of select.

oob/tcprecv03p.c

 1 #include   "unp.h"

 2 int
 3 main(int argc, char **argv)
 4 {
 5     int     listenfd, connfd, n, justreadoob = 0;
 6     char    buff[100];
 7     struct pollfd pollfd[1];

 8     if (argc == 2)
 9         listenfd = Tcp_listen(NULL, argv[1], NULL);
10     else if (argc == 3)
11         listenfd = Tcp_listen(argv[1], argv[2], NULL);
12     else
13         err_quit("usage: tcprecv03p [ <host> ] <port#>");

14     connfd = Accept(listenfd, NULL, NULL);

15     pollfd[0].fd = connfd;
16     pollfd[0].events = POLLRDNORM;
17     for ( ; ; ) {
18         if (justreadoob == 0)
19             pollfd[0].events|= POLLRDBAND;
20         Poll(pollfd, 1, INFTIM);

21         if (pollfd[0].revents & POLLRDBAND) {
22             n = Recv(connfd, buff, sizeof(buff) - 1, MSG_OOB);
23             buff[n] = 0;        /* null terminate */
24             printf("read %d OOB byte: %s\n", n, buff);
25             justreadoob = 1;
26             pollfd[0].events &= ~POLLRDBAND;    /* turn bit off */
27         }

28         if (pollfd[0].revents & POLLRDNORM) {
29             if ( (n = Read(connfd, buff, sizeof(buff) - 1)) == 0) {
30                 printf("received EOF\n");
31                 exit(0);
32             }
33             buff[n] = 0;        /* null terminate */
34             printf("read %d bytes: %s\n", n, buff);
35             justreadoob = 0;
36         }
37     }
38 }


    [ Team LiB ] Previous Section Next Section