Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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()轮询方法,我应该将套接字设置为非阻塞吗?_C_Sockets_Tcp - Fatal编程技术网

如果我使用select()轮询方法,我应该将套接字设置为非阻塞吗?

如果我使用select()轮询方法,我应该将套接字设置为非阻塞吗?,c,sockets,tcp,C,Sockets,Tcp,我使用select()轮询函数来确定何时从套接字读取数据。我这样做是为了不必依赖于诸如accept()和recv()之类的阻塞函数。由于select()会一直阻塞,直到文件句柄有数据为止,因此是否需要使用fcntl()将套接字设置为非阻塞 在我看来,这是不必要的,因为select()函数告诉我数据已经准备好从套接字文件句柄读取 我见过程序员使用select()并将套接字设置为非阻塞的代码,我见过程序员使用select并保留阻塞设置的代码。哪个是正确的?使用select()并将套接字设置为非阻塞是

我使用select()轮询函数来确定何时从套接字读取数据。我这样做是为了不必依赖于诸如accept()和recv()之类的阻塞函数。由于select()会一直阻塞,直到文件句柄有数据为止,因此是否需要使用fcntl()将套接字设置为非阻塞

在我看来,这是不必要的,因为select()函数告诉我数据已经准备好从套接字文件句柄读取


我见过程序员使用select()并将套接字设置为非阻塞的代码,我见过程序员使用select并保留阻塞设置的代码。哪个是正确的?使用select()并将套接字设置为非阻塞是否有好处?

是的,通常应将套接字设置为非阻塞。原因如下:

  • 在向套接字写入时,可以向套接字写入的事实并不一定意味着可以在不阻塞的情况下向套接字写入所有需要的内容。因此,如果有大量数据要写入套接字,那么对套接字的写入可能会被阻塞,但套接字缓冲区只能容纳少量数据

  • 从套接字读取数据时,存在要从套接字读取的数据这一事实并不一定意味着将有您想要的所有数据(尽管如果您这样做,它将返回一个简短的读取)


如果您一次只写或读一个字节,我想这是一个例外,但这是一个罕见的例外。

当然这取决于您的用例,但根据我的经验,如果您想做比基本示例更重要的事情,非阻塞套接字是一个不错的选择。您也可以使用多个线程,但我还是倾向于使用非阻塞套接字。如果用户提供的整个缓冲区无法填充,则从套接字读取不会阻塞。它只会尽可能地填充内容——不管套接字是否是非阻塞的。@FilipeGonçalves我认为,如果未设置
O_NONBLOCK
,那么写操作可能会阻塞,也可能以短写完成。你不能保证它不会堵塞。这不对吗?表示“如果O_NONBLOCK标志清除,则写入请求可能会导致线程阻塞,但在正常完成时,它将返回nbyte。”是的,您完全正确-我说的是读取,而不是写入。我同意你的看法。由于我提到的原因,你关于阅读的第一句话对我来说似乎不正确。@FilipeGonçalves-doh。是的,你说得很对。修正了。@FilipeGonçalves关于阻塞模式下的
write()
的错误。它必须阻塞,直到所有数据传输完毕。Posix规范需要它。