APUE course source code
guowenxue
yesterday 7b55c92f8d1401a93c8fd8e342da271dce742000
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
/*********************************************************************************
 *      Copyright:  (C) 2025 LingYun IoT System Studio
 *                  All rights reserved.
 *
 *       Filename:  poll.c
 *    Description:  This file is poll example.
 *
 *        Version:  1.0.0(11/06/2025)
 *         Author:  Guo Wenxue <guowenxue@gmail.com>
 *      ChangeLog:  1, Release initial version on "11/06/2025 10:33:45 AM"
 *
 ********************************************************************************/
#include <stdio.h>
#include <poll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
 
#define MAX_FDS     2 /*  监听 STDIN + sockfd */
 
int main(void)
{
    int                 sockfd;
    struct sockaddr_in  addr;
    int                 ret;
    int                 reuse = 1;
    struct pollfd       fds[MAX_FDS];
 
    sockfd = socket(AF_INET, SOCK_STREAM, 0); /* 创建套接字 */
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(8888);
    addr.sin_addr.s_addr = INADDR_ANY;
 
    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
    bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
    listen(sockfd, 5);
 
    /* 监听标准输入(键盘)是否有数据 */
    fds[0].fd = STDIN_FILENO;
    fds[0].events = POLLIN;
 
    /* 监听 socket 是否有新连接 */
    fds[1].fd = sockfd;
    fds[1].events = POLLIN;
 
    printf("poll() monitor socket[8888] and stdin now...\n");
 
    while (1)
    {
        /* 调用 poll 等待事件发生 */
        ret = poll(fds, MAX_FDS, 10000);
        if (ret == -1)
        {
            perror("poll error");
            break;
        }
        else if (ret == 0)
        {
            printf("timeout...\n");
            continue;
        }
 
        /* 程序走到这里说明ret>0,即监听的文件描述符中有事件发生了. */
 
        /* 检查标准输入是否可读 */
        if (fds[0].revents & POLLIN)
        {
            char buf[128];
            read(STDIN_FILENO, buf, sizeof(buf));
            printf("You typed in keyboard: %s\n", buf);
        }
 
        /* 检查监听 socket 是否有连接到来 */
        if (fds[1].revents & POLLIN)
        {
            int client = accept(sockfd, NULL, NULL);
            printf("Accept and close connection: %d\n", client);
            close(client);
        }
    }
 
    close(sockfd);
    return 0;
}