基于libevent, libuv和android Looper不断演进socket编程

最近在做websocket  porting的工作中,需要实现最底层socket读和写,基于同步读,libevent, libuv和android Looper都写了一套,从中体会不少。

1)同步阻塞读写

最开始采用同步阻塞读写,主要是为了快速实现来验证上层websocket协议的完备性。优点仅仅是实现起来简单,缺点就是效率不高,不能很好利用线程的资源,建立连接这一块方法都是类似的,主要的区别是在如何读写数据,先看几种方法共用的一块:

    int n = 0;
    struct sockaddr_in serv_addr;
    event_init();
    if((mSockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
        //TODO error
        return;
    }
    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(url.port());
    if(inet_pton(AF_INET, url.host().utf8().data(), &serv_addr.sin_addr)<=0){
        return;
    }
    if( connect(mSockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){
        return;
    }

这里由于是client,所以比较简单,当然缺失了DNS解析这一块。然后,就是要监视读数据,由于是同步阻塞读,所以需要在循环里不断地去read/recv:

    while (1) {
        ssize_t result = recv(fd, buf, sizeof(buf), 0);
        if (result == 0) {
            break;
        } else if (result < 0) {
            perror("recv");
            close(fd);
            return 1;
        }
        fwrite(buf, 1, result, stdout);
    }

缺点就显而易见&#
阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
libevent是一个事件驱动的网络编程库,它提供了高效的事件处理机制,可以在多种操作系统平台上运行。为了更好地利用libevent提供的优势,我们可以使用线程池来管理多个并发请求。 下面是一个基于libevent的简单线程池实现: ```c #include <event2/event.h> #include <event2/thread.h> #include <pthread.h> #define THREAD_POOL_SIZE 4 struct thread_pool { pthread_t threads[THREAD_POOL_SIZE]; struct event_base *base; }; void* thread_func(void *arg) { struct event_base *base = (struct event_base*)arg; event_base_dispatch(base); return NULL; } struct thread_pool* thread_pool_new() { struct thread_pool *pool = malloc(sizeof(struct thread_pool)); pool->base = event_base_new(); // Initialize libevent thread support evthread_use_pthreads(); // Create worker threads for (int i = 0; i < THREAD_POOL_SIZE; i++) { pthread_create(&pool->threads[i], NULL, thread_func, pool->base); } return pool; } void thread_pool_destroy(struct thread_pool *pool) { // Stop the event loop on all threads event_base_loopexit(pool->base, NULL); // Wait for all threads to exit for (int i = 0; i < THREAD_POOL_SIZE; i++) { pthread_join(pool->threads[i], NULL); } // Free the event base and the pool itself event_base_free(pool->base); free(pool); } void thread_pool_dispatch(struct thread_pool *pool, struct event *ev) { event_base_priority_init(pool->base, 2); event_base_set(pool->base, ev); event_add(ev, NULL); } ``` 这个线程池使用libevent提供的事件循环机制来处理多个并发请求。它启动了一个包含多个线程的事件循环,每个线程都可以处理事件。当一个事件需要处理时,线程池会将该事件加入到事件队列中,由空闲的线程来处理。 线程池的使用非常简单,只需要创建一个线程池对象,然后通过调用`thread_pool_dispatch`函数来将需要处理的事件加入到事件队列中即可。当不再需要使用线程池时,只需要调用`thread_pool_destroy`函数来释放线程池对象和相关资源。 需要注意的是,这个线程池的实现是比较简单的,适用于处理轻量级的请求。如果需要处理更加复杂的请求,可能需要进行更多的优化和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cutesource

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值