读书人

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

发布时间: 2013-12-20 00:23:10 作者: rapoo

大侠请留步,急急急!!!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);
}
}
}

读书人网 >C++

热点推荐