首页 > 其他分享 >libubox库uloop的使用

libubox库uloop的使用

时间:2024-11-12 11:19:25浏览次数:1  
标签:addr sock server uloop fd 使用 include libubox

1. 定时器使用

#include <stdio.h>
#include <libubox/uloop.h>

void my_timer_callback(struct uloop_timeout *timeout) {
printf("Timer trigger.\n");
uloop_timeout_set(timeout, 2000); // 重置定时器
}
int main()
{
uloop_init();
struct uloop_timeout my_timer = {
.cb = my_timer_callback,
};
uloop_timeout_set(&my_timer, 2000); // 每隔2秒触发一次
uloop_run();
uloop_done();
return 0;
}

--------------------------------------------------------------------------------------

2 socket 

#include <libubox/uloop.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <fcntl.h>

#define PORT 12345

// 事件回调函数,当socket有数据可读时触发
void read_callback(struct uloop_fd *fd, unsigned int events) {
char buffer[128];
int len = read(fd->fd, buffer, sizeof(buffer) - 1);
if (len > 0) {
buffer[len] = '\0';
printf("Received data: %s\n", buffer);
} else if (len == 0) {
printf("Connection closed by peer.\n");
uloop_fd_delete(fd); // 删除文件描述符
close(fd->fd); // 关闭socket
free(fd); // 释放内存
} else {
perror("Error reading data");
uloop_fd_delete(fd); // 删除文件描述符
close(fd->fd); // 关闭socket
free(fd); // 释放内存
}
}

// 事件回调函数,当socket可接受连接时触发
void server_callback(struct uloop_fd *fd, unsigned int events) {
struct sockaddr_in client_addr;
socklen_t addr_len = sizeof(client_addr);
int client_sock = accept(fd->fd, (struct sockaddr *)&client_addr, &addr_len);

if (client_sock < 0) {
perror("Accept failed");
return;
}

printf("Client connected\n");

// 设置为非阻塞模式
int flags = fcntl(client_sock, F_GETFL, 0);
fcntl(client_sock, F_SETFL, flags | O_NONBLOCK);

// 为新客户端创建 uloop_fd 结构

struct uloop_fd *client_fd = malloc(sizeof(struct uloop_fd));
client_fd->fd = client_sock;
client_fd->cb = read_callback;

// 将客户端的文件描述符添加到 uloop 中,监听可读事件
uloop_fd_add(client_fd, ULOOP_READ);
}

int main() {
struct sockaddr_in server_addr;

// 初始化 uloop 库
uloop_init();

// 创建服务器 socket
int server_sock = socket(AF_INET, SOCK_STREAM, 0);
if (server_sock < 0) {
perror("Socket creation failed");
return -1;
}

// 设置服务器 socket 为非阻塞模式
int flags = fcntl(server_sock, F_GETFL, 0);
fcntl(server_sock, F_SETFL, flags | O_NONBLOCK);

// 绑定 socket 到端口
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);

if (bind(server_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(server_sock);
return -1;
}

// 监听连接
if (listen(server_sock, 5) < 0) {
perror("Listen failed");
close(server_sock);
return -1;
}

printf("Server listening on port %d\n", PORT);

// 为服务器 socket 创建 uloop_fd 结构
struct uloop_fd server_fd;
server_fd.fd = server_sock;
server_fd.cb = server_callback;

// 将服务器 socket 添加到 uloop 中,监听可读事件
uloop_fd_add(&server_fd, ULOOP_READ);

// 运行 uloop 事件循环
uloop_run();

// 清理
uloop_done();
close(server_sock);
return 0;
}

---------------------------------------------------------------

3 信号

#include <stdio.h>
#include <libubox/uloop.h>
// 信号回调函数
void my_signal_callback(int signo, void *data) {
printf("Received signal %d, exiting...\n", signo);
uloop_end(); // 结束事件循环
}
int main() {
uloop_init();
// 3. 设置信号事件,监听 SIGINT 信号
struct uloop_signal my_signal = {
.signo = SIGINT,
.cb = my_signal_callback,
};
uloop_signal_add(&my_signal);
printf("Starting event loop...\n");
uloop_run();

// 清理资源
uloop_done();
printf("Event loop ended.\n");
}

--------------------------------------------------------------------------------------

4 父子进程

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <libubox/uloop.h>

 

// 子进程回调函数
void my_process_callback(struct uloop_process *process, int ret) {
printf("Child process %d exited with code %d getpid=%d.\n", process->pid, ret, getpid());
uloop_end(); // 结束事件循环
}

int main()
{
uloop_init();
// 4. 创建子进程并监听其退出事件
pid_t pid = fork();
if (pid == 0) {
// 子进程代码
sleep(5); // 模拟任务执行
exit(0); // 子进程退出
} else {
// 父进程中添加子进程监听
struct uloop_process my_process = {
.pid = pid,
.cb = my_process_callback,
};
printf("parent1\n");
uloop_process_add(&my_process);
printf("parent2\n");//父进程可以继续执行不用阻塞等待子进程的退出
}
printf("Starting event loop...\n");
uloop_run();
uloop_done();
printf("Event loop ended.\n");
return 0;
}

 

标签:addr,sock,server,uloop,fd,使用,include,libubox
From: https://www.cnblogs.com/xpylovely/p/18541495

相关文章

  • HyperWorks使用六面体和三棱柱单元进行实体网格剖分
    本节将演示如何使用solidmap功能对一个复杂的几何实体进行网格剖分。剖分的思路是:首先对该实体进行适当的切割,以使其各个部分均处于mappable的状态;然后分别对各个子块进行solidmap剖分。事实上,针对同一个几何实体,可能有多种分块方案。究竟哪种方案能获得更高质量的网格,是......
  • Java 中 Stream 流的使用方法
    Java中Stream流的使用方法目录一、Stream的概念二、Stream的特点三、Stream的使用步骤1、Stream的创建        1.1、通过Collection对象的stream()或parallelStream()方法       1.1.1、stream()和parallelStream()两个方法的区别      ......
  • B端体验深耕-洞察用户需求,打造心有灵犀的使用体验
    作者:京东科技程跃宇   前言我们常以“心有灵犀”来形容与合作伙伴的默契配合,若我们的产品能与用户达到同样的默契,将极大地提升用户在任务旅程中的流畅体验。在B端体验设计领域,我们深知用户对我们产品的期待───快速完成任务、即用即走;然而,随着业务需求和产品功能的不......
  • 学生HTML个人网页作业作品 使用HTML+CSS+JavaScript个人介绍博客网站 web前端课程设计
    ......
  • express使用morgan+file-stream-rotator实现自定义日志+轮转
    importexpress,{json}from'express';importfsfrom'fs';importpathfrom'path';importmorganfrom'morgan';importFileStreamRotatorfrom'file-stream-rotator';constapp=express();//自动采集一些东西//......
  • 在电脑使用有线网的前提下, 给电脑连接无线网并用这个无线网访问指定IP
    连接上无线网后cmd命令行使用ipconfig查看无线网的网关: 将下面的命令保存到.bat脚本中,使用windows管理员权限执行脚本添加一个自定义路由红色部分是你想要访问的目标IP,绿色部分是子网掩码(不用改),蓝色部分是你的无线网网关地址routeadd39.103.205.129mask255......
  • mybatis-generator使用
    Mybatis-generator使用一.添加依赖 <!--首先要有mybatis的依赖和数据库驱动--> <dependencies> <!--mybatis依赖--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-......
  • 使用 PostScript 实现简单的 OCR 处理
    PostScript并不直接支持图像处理,因此我们将展示如何通过一些基本图像绘制和简单字符检测来模拟文字识别的概念。读取图像并转换为灰度图由于PostScript并不原生支持读取图像,这里假设我们可以将图像以数据的形式加载,并通过PostScript的逻辑来绘制出图像的灰度形式。posts......
  • git使用
    配置设置用户名和邮件地址,每次Git提交都会使用这些信息$gitconfig--globaluser.name"JohnDoe"[email protected]检查配置,列出所有Git当时能找到的配置$gitconfig--list查找特定配置gitconfig<key>,查找用户名$gitconfig......
  • 如何延长便携式负载箱使用寿命?
    便携式负载箱是一种用于测试和校准电力设备的设备,它能够模拟实际的负载情况,帮助用户确保设备的性能和安全性。然而,这种设备的价格通常较高,因此,延长其使用寿命对于用户来说是非常重要的。以下是一些可以帮助你延长便携式负载箱使用寿命的建议:正确使用:首先,你需要正确使用便携式负......