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

本文探讨了在WebSocket移植过程中,从同步阻塞读写到使用libevent、libuv以及Android Looper进行异步非阻塞读写的演变。对比了各种方法的优缺点,指出在Android环境下可直接使用Looper,跨平台则推荐libuv,以提高效率并简化线程同步问题。
摘要由CSDN通过智能技术生成

最近在做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);
    }

缺点就显而易见&#
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值