首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

大侠请留步,socket 怎么非阻塞是读取数据

2013-12-20 
大侠请留步,急急急!!!socket 怎样非阻塞是读取数据char reply[max_length]boost::system::error_code err

大侠请留步,急急急!!!socket 怎样非阻塞是读取数据


char reply[max_length];
boost::system::error_code error;
size_t reply_length = sock->read_some(boost::asio::buffer(reply), error);


怎样实现添加个定时器
1、读取到数据立刻返回
2、时间到了没有读取到数据就返回 c++ socket read_some 定时器 非阻塞
[解决办法]
select就有这功能啊
[解决办法]
设置超时,recv的时候加上超时时间就可以了。
[解决办法]
参考boost\libs\asio\example\cpp03\timeouts下的例子。
[解决办法]
简单参考下

//利用了select函数监听读,写,异常
 while (1) {
        maxfd = listener;

        FD_ZERO(&readset);
        FD_ZERO(&writeset);
        FD_ZERO(&exset);

        FD_SET(listener, &readset);

        for (i=0; i < FD_SETSIZE; ++i) {
            if (state[i]) {
                if (i > maxfd)
                    maxfd = i;
                FD_SET(i, &readset);
                if (state[i]->writing) {
                    FD_SET(i, &writeset);
                }
            }
        }

        if (select(maxfd+1, &readset, &writeset, &exset, NULL) < 0) {
            perror("select");
            return;
        }

        if (FD_ISSET(listener, &readset)) {
            struct sockaddr_storage ss;
            socklen_t slen = sizeof(ss);
            int fd = accept(listener, (struct sockaddr*)&ss, &slen);
            if (fd < 0) {
                perror("accept");
            } else if (fd > FD_SETSIZE) {
                close(fd);
            } else {
                make_nonblocking(fd);
                state[fd] = alloc_fd_state();
                assert(state[fd]);/*XXX*/
            }
        }

        for (i=0; i < maxfd+1; ++i) {
            int r = 0;
            if (i == listener)
                continue;

            if (FD_ISSET(i, &readset)) {
                r = do_read(i, state[i]);


            }
            if (r == 0 && FD_ISSET(i, &writeset)) {
                r = do_write(i, state[i]);
            }
            if (r) {
                free_fd_state(state[i]);
                state[i] = NULL;
                close(i);
            }
        }
    }

热点排行