在Linux C开发中基于FD_ISSET和select生成事件监听的样例代码,要求可以正常运行
时间: 2024-11-04 21:16:18 浏览: 9
在Linux C开发中,`FD_SET`, `select` 和 `poll` 系统调用常用于网络和I/O密集型应用,如创建事件监听系统。下面是一个简单的示例代码片段,展示了如何使用`FD_SET`和`select`来监听文件描述符集合:
```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/select.h>
#include <unistd.h>
#include <fcntl.h>
#define MAX_EVENTS 10
int main() {
int server_fd, client_fd;
struct sockaddr_in server_addr, client_addr;
socklen_t addr_len = sizeof(client_addr);
fd_set read_fds;
FD_ZERO(&read_fds);
// 创建套接字并绑定服务器地址
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd == -1) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY); // 使用本机IP
server_addr.sin_port = htons(12345); // 设置端口
if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {
perror("Binding failed");
close(server_fd);
exit(EXIT_FAILURE);
}
listen(server_fd, MAX_EVENTS);
while (true) {
FD_SET(server_fd, &read_fds); // 添加服务器套接字到读取事件集合
select(MAX_EVENTS + 1, &read_fds, NULL, NULL, NULL); // 监听事件
if (FD_ISSET(server_fd, &read_fds)) { // 如果服务器套接字有新连接
client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &addr_len);
if (client_fd != -1) {
printf("Accepted connection from %s:%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
// 对客户端套接字进行处理...
} else {
perror("Accept failed");
}
}
}
close(server_fd);
return 0;
}
阅读全文