Srs之state-threads研究

srs主要是依托与state-threads进行的开发,state-threads是个C的协程库,可以极大的提高系统的性能。

这里先简单研究一下state-threads的api使用。

第一步:调用初始化

    if (st_init() < 0) {
        print_sys_error("st_init");
        exit(1);
    }

第二步:直接在main函数里面启动一个循环,等待tcp连接上来

    for ( ; ; ) {
        n = sizeof(cli_addr);
        cli_nfd = st_accept(srv_nfd, (struct sockaddr *)&cli_addr, &n,
                            ST_UTIME_NO_TIMEOUT);
        if (cli_nfd == NULL) {
            print_sys_error("st_accept");
            exit(1);
        }
        if (st_thread_create(handle_request, cli_nfd, 0, 0) == NULL) {
            print_sys_error("st_thread_create");
            exit(1);
        }
    }

第三步:之后就会创建一个st的协程,可以在处理函数里面,handle_request 里面开启循环,但是,,这里面是一个线程

static void *handle_request(void *arg)
{
    struct pollfd pds[2];
    st_netfd_t cli_nfd, rmt_nfd;
    int sock;

    cli_nfd = (st_netfd_t) arg;
    pds[0].fd = st_netfd_fileno(cli_nfd);
    pds[0].events = POLLIN;

    /* Connect to remote host */
    if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
        print_sys_error("socket");
        goto done;
    }
    if ((rmt_nfd = st_netfd_open_socket(sock)) == NULL) {
        print_sys_error("st_netfd_open_socket");
        close(sock);
        goto done;
    }
    if (st_connect(rmt_nfd, (struct sockaddr *)&rmt_addr,
                   sizeof(rmt_addr), ST_UTIME_NO_TIMEOUT) < 0) {
        print_sys_error("st_connect");
        st_netfd_close(rmt_nfd);
        goto done;
    }
    pds[1].fd = sock;
    pds[1].events = POLLIN;

    /*
     * Now just pump the data through.
     * XXX This should use one thread for each direction for true full-duplex.
     */
    for ( ; ; ) {
        pds[0].revents = 0;
        pds[1].revents = 0;

        if (st_poll(pds, 2, ST_UTIME_NO_TIMEOUT) <= 0) {
            print_sys_error("st_poll");
            break;
        }

        if (pds[0].revents & POLLIN) {
            if (!pass(cli_nfd, rmt_nfd))
                break;
        }

        if (pds[1].revents & POLLIN) {
            if (!pass(rmt_nfd, cli_nfd))
                break;
        }
    }
    st_netfd_close(rmt_nfd);

    done:

    st_netfd_close(cli_nfd);

    return NULL;
}

 

你可能感兴趣的:(srs)