zoukankan      html  css  js  c++  java
  • Linux select()详解

    int select(nfds, readfds, writefds, exceptfds, timeout)  
    int nfds;  
    fd_set *readfds, *writefds, *exceptfds;  
    struct timeval *timeout;  

    ndfs:select监视的文件句柄数,视进程中打开的文件数而定,一般设为呢要监视各文件 中的最大文件号加一。  
    readfds:select监视的可读文件句柄集合。  
    writefds: select监视的可写文件句柄集合。  
    exceptfds:select监视的异常文件句柄集合。  
    timeout:本次select()的超时结束时间。

    当readfds或writefds中映象的文件可读或可写或超时,本次select() 就结束返回。程序员利用一组系统提供的宏在select()结束时便可判 断哪一文件可读或可写。对Socket编程特别有用的就是readfds。 几只相关的宏解释如下:  

    FD_ZERO(fd_set *fdset):清空fdset与所有文件句柄的联系。  
    FD_SET(int fd, fd_set *fdset):建立文件句柄fd与fdset的联系。  
    FD_CLR(int fd, fd_set *fdset):清除文件句柄fd与fdset的联系。  
    FD_ISSET(int fd, fdset *fdset):检查fdset联系的文件句柄fd是否  
    可读写,>0表示可读写

    补充关于select在异步(非阻塞)connect中的应用,刚开始搞socket编程的时候 
    我一直都用阻塞式的connect,非阻塞connect的问题是由于当时搞proxy scan 
    而提出的呵呵 
    通过在网上与网友们的交流及查找相关FAQ,总算知道了怎么解决这一问题.同样 
    用select可以很好地解决这一问题.大致过程是这样的: 

    1.将打开的socket设为非阻塞的,可以用fcntl(socket, F_SETFL, O_NDELAY)完 
    成(有的系统用FNEDLAY也可). 

    2.发connect调用,这时返回-1,但是errno被设为EINPROGRESS,意即connect仍旧 
    在进行还没有完成. 

    3.将打开的socket设进被监视的可写(注意不是可读)文件集合用select进行监视, 
    如果可写,用 
    getsockopt(socket, SOL_SOCKET, SO_ERROR, &error, sizeof(int)); 
    来得到error的值,如果为零,则connect成功. 

    在许多unix版本的proxyscan程序你都可以看到类似的过程,另外在solaris精华 

    区->编程技巧中有一个通用的带超时参数的connect模块..

  • 相关阅读:
    c#生成html静态文件时出现空白行,怎么去掉utf-8中的bom
    解决网站发布404返回200,301等状态
    创建本地缓存
    创建windows服务
    C#DateTime与Unix时间戳的转换
    Oracle数据访问组件ODAC的安装方法:
    用任意语言与WebService进行交互
    又一种XML的解析方法
    TopShelf框架创建Windows服务作为Remoting的宿主案例:
    bootstrap 时间控件带(时分秒)选择器(需要修改才能显示,请按照参数说明后面的步骤进行修改)
  • 原文地址:https://www.cnblogs.com/p2liu/p/6048831.html
Copyright © 2011-2022 走看看