struct timeval tv; /* 申明一个时间变量来保存时间 */
int ret; /* 保存返回值 */
FD_ZERO(&rdfds); /* 用select函数之前先把集合清零 */
FD_SET(socket, &rdfds); /* 把要检测的句柄socket加入到集合里 */
tv.tv_sec = 1;
tv.tv_usec = 500; /* 设置select等待的最大时间为1秒加500毫秒 */
ret = select(socket + 1, &rdfds, NULL, NULL, &tv); /* 检测我们上面设置到集合rdfds里的句柄是否有可读信息 */
if(ret < 0) perror(“select”);/* 这说明select函数出错 */
else if(ret == 0) printf(“超时\n”); /* 说明在我们设定的时间值1秒加500毫秒的时间内,socket的状态没有发生变化 */
else { /* 说明等待时间还未到1秒加500毫秒,socket的状态发生了变化 /
printf(“ret=%d\n”, ret); / ret这个返回值记录了发生状态变化的句柄的数目,由于我们只监视了socket这一个句柄,所以这里一定ret=1,如果同时有多个句柄发生变化返回的就是句柄的总和了 /
/ 这里我们就应该从socket这个句柄里读取数据了,因为select函数已经告诉我们这个句柄里有数据可读 */
if(FD_ISSET(socket, &rdfds)) { /* 先判断一下socket这外被监视的句柄是否真的变成可读的了 */
/* 读取socket句柄里的数据 */
recv(...);
}
}
注意select函数的第一个参数,是所有加入集合的句柄值的最大那个值还要加1。比如我们创建了3个句柄:
- int sa, sb, sc;
- sa = socket(...); /* 分别创建3个句柄并连接到服务器上 */
- connect(sa,...);
- sb = socket(...);
- connect(sb,...);
- sc = socket(...);
- connect(sc,...);
- FD_SET(sa, &rdfds);/* 分别把3个句柄加入读监视集合里去 */
- FD_SET(sb, &rdfds);
- FD_SET(sc, &rdfds);
- 在使用select函数之前,一定要找到3个句柄中的最大值是哪个,我们一般定义一个变量来保存最大值,取得最大socket值如下:
- int maxfd = 0;
- if(sa > maxfd) maxfd = sa;
- if(sb > maxfd) maxfd = sb;
- if(sc > maxfd) maxfd = sc;
- 然后调用select函数:
- ret = select(maxfd + 1, &rdfds, NULL, NULL, &tv); /* 注意是最大值还要加1 */
int sa, sb, sc; sa = socket(...); /* 分别创建3个句柄并连接到服务器上 */ connect(sa,...); sb = socket(...); connect(sb,...); sc = socket(...); connect(sc,...);
FD_SET(sa, &rdfds);/* 分别把3个句柄加入读监视集合里去 */
FD_SET(sb, &rdfds);
FD_SET(sc, &rdfds);
在使用select函数之前,一定要找到3个句柄中的最大值是哪个,我们一般定义一个变量来保存最大值,取得最大socket值如下:
int maxfd = 0;
if(sa > maxfd) maxfd = sa;
if(sb > maxfd) maxfd = sb;
if(sc > maxfd) maxfd = sc;
然后调用select函数:
ret = select(maxfd + 1, &rdfds, NULL, NULL, &tv); /* 注意是最大值还要加1 /
同样的道理,如果我们要检测用户是否按了键盘进行输入,我们就应该把标准输入0这个句柄放到select里来检测,如下:
- FD_ZERO(&rdfds);
- FD_SET(0, &rdfds);
- tv.tv_sec = 1;
- tv.tv_usec = 0;
- ret = select(1, &rdfds, NULL, NULL, &tv); / 注意是最大值还要加1 /
- if(ret < 0) perror(“select”);/ 出错 /
- else if(ret == 0) printf(“超时\n”); / 在我们设定的时间tv内,用户没有按键盘 /
- else { / 用户有按键盘,要读取用户的输入 /
- scanf("%s", buf);
FD_ZERO(&rdfds);
FD_SET(0, &rdfds);
tv.tv_sec = 1;
tv.tv_usec = 0;
ret = select(1, &rdfds, NULL, NULL, &tv); / 注意是最大值还要加1 /
if(ret < 0) perror(“select”);/ 出错 /
else if(ret == 0) printf(“超时\n”); / 在我们设定的时间tv内,用户没有按键盘 /
else { / 用户有按键盘,要读取用户的输入 */
scanf("%s", buf);
<script>
(function() {
var s = "_" + Math.random().toString(36).slice(2);
document.write('<div id="' + s + '"></div>');
(window.slotbydup=window.slotbydup || []).push({
id: '4774193',
container: s,
size: '728,90',
display: 'inlay-fix'
});
})();
jQuery(function(){
window.csdn.recommendSide({
contentBox: "recommend",
postBox: jQuery(".news-right-side"),
query:'linux c学习笔记----select函数详解',
popu:'725'
})
});
</script><div id="_v8lfrzukrwh"></div><script charset="utf-8" src="https://pos.baidu.com/fcvm?psi=d4b3a5e7e542f902d8ae5c1ac7ed4d5d&di=4774193&dri=0&dis=0&dai=0&ps=3068x580&enu=encoding&dcb=___adblockplus&dtm=SSP_JSONP&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1544747192629&ti=linux%20c%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0----select%E5%87%BD%E6%95%B0%E8%AF%A6%E8%A7%A3%20-%20%E7%9F%A5%E7%9F%A5%E4%B8%BA%E7%9F%A5%E7%9F%A5%20-%20ITeye%E5%8D%9A%E5%AE%A2&ari=2&dbv=2&drs=1&pcs=1903x938&pss=1903x3116&cfv=0&cpl=3&chi=3&cce=true&cec=UTF-8&tlm=1544747192&prot=2&rw=938&ltu=https%3A%2F%2Flobert.iteye.com%2Fblog%2F1768502&ecd=1&uc=1920x1040&pis=-1x-1&sr=1920x1080&tcn=1544747193&exps=110000"></script><a href="http://www.baidu.com/cb.php?c=IgF_pyfqnHmkn1m1rHc0IZ0qnfK9ujYzrjm3nHbs0Aw-5Hnsn16YnjT0TAq15HfLP1fkrHn0T1dbP1fsujndmWbLmHRvny7b0AwY5HDdPjfLPjTkrHn0IgF_5y9YIZK1rBtEuywdQhP1uA38UhNYQLwETA-WQv7GnW0OIgwVgLPEIgFWuHdBUAqMpgw-XyR0ThfqnHD0mhYqnfKsTWYs0ZNGujYkPHTYn1mk0AqGujYknWb3rjDY0APGujYLn1bdn1n0ULI85H00TZbqnW0v0APzm1YkPH6vns" target="_blank" style="text-decoration:none;">
">