/********************************************************************************* * 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 * ChangeLog: 1, Release initial version on "11/06/2025 10:33:45 AM" * ********************************************************************************/ #include #include #include #include #include #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; }