/*********************************************************************************
|
* 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;
|
}
|