Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在套接字编程中使用select()函数?_Select_Sockets_File Descriptor - Fatal编程技术网

如何在套接字编程中使用select()函数?

如何在套接字编程中使用select()函数?,select,sockets,file-descriptor,Select,Sockets,File Descriptor,原型是: int select (int nfds, fd_set *read-fds, fd_set *write-fds, fd_set *except-fds, struct timeval *timeout); 很长一段时间以来,我一直在努力理解这个函数。我的问题是,如果它检查从0到nfds-1的所有文件描述符,并在返回时修改读FD、写FD和除FD之外的所有文件描述符,为什么我需要使用FD_

原型是:

int select (int nfds,
            fd_set *read-fds,
            fd_set *write-fds,
            fd_set *except-fds,
            struct timeval *timeout);

很长一段时间以来,我一直在努力理解这个函数。我的问题是,如果它检查从0到nfds-1的所有文件描述符,并在返回时修改读FD、写FD和除FD之外的所有文件描述符,为什么我需要使用FD_SET在开始时将文件描述符添加到集合中,它将检查所有文件描述符,还是不检查?

它不会检查从0到
nfds
-1。第一个参数只是提供了一个上限,说明所使用的文件描述符在数字上有多大。这是因为集合本身可能表示为位向量,而无法知道实际使用了多少位。将此指定为单独的参数有助于
select()
避免检查未使用的文件描述符


此外,调用
select()
时不在读取集中的描述符根本没有被检查,因此当调用返回时,它也不能出现在读取集中。

我曾经有过与您相同的疑问。您可以查看以下问题和答案:


这是
选择
已损坏的?:)