c/c++语言开发共享c中有刺激性的select()行为

while (xxx) { timeout.tv_sec=TIMEOUT; timeout.tv_usec=0; FD_ZERO(&set); FD_SET(sd,&set); switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout)) xxxxx } 

然而,工作正常

 FD_ZERO(&set); FD_SET(sd,&set); while (xxx) { timeout.tv_sec=TIMEOUT; timeout.tv_usec=0; switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout)) xxxxx } 

没有。 它第一次工作,但下次它运行while循环时,即使sd套接字接收数据,它也会获得超时。 在我看来,每次都必须清空和填充设置是浪费资源。

任何人都有一个很好的解释为什么这是,甚至更好,也许是一个如何避免它的建议?

    select修改其参数。 你真的必须每次重新初始化它。

    如果您担心开销,那么在内核中处理完整FD_SET的成本比FD_ZERO的成本更重要。 您只想传递最大fd,而不是FD_SETSZIZE,以最小化内核处理。 在你的例子中:

     switch (select((sd + 1),&set,NULL,NULL,&timeout)) 

    对于具有多个fds的更复杂的情况,通常最终会维护一个max变量:

     FD_SET(sd,&set); if (sd > max) max = sd; ... repeat many times... switch (select((max + 1),&set,NULL,NULL,&timeout)) 

    如果你有大量的文件描述符,并担心将它们放在一起,你应该看看select()的一些替代方法。 你没有提到你正在使用的操作系统,但对于类Unix操作系统,有一些:

    API是不同的,但它们本质上都是一个有状态的内核接口,用于维护一组活动文件描述。 将fd添加到集合后,您将收到有关该fd的事件的通知,而无需再次将其连续传递。

    阅读选择手册页。 返回的集合只是可以使用的文件描述符。 您应该使用FD_ISSET检查每个是否已设置。

    始终在使用前初始化fd_set。

    这就是选择的方式。 如果你有多个套接字,它效果最好,更有意义。 这就是重点:你正在选择多个套接字。 如果要从一个插槽读取,只需读取或重新读取即可。

    需要了解更多c/c++开发分享c中有刺激性的select()行为,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享c中有刺激性的select()行为相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/978949.html

      (0)
      上一篇 2021年12月12日
      下一篇 2021年12月12日

      精彩推荐