在Linux上使用C语言打开O_NONBLOCKING

3

***背景**** 我对TCP不太了解,所以我的问题可能有点基础。我正在尝试在接收数据的套接字上打开O_NONBLOCK。到目前为止,我已经尝试了两种不同的设置O_NONBLOCK的方法,itcl()和fcntl()。现在我正在尝试让fcntl()工作。

我的问题:您是应该在连接套接字之前还是之后设置O_NONBLOCK?

**我目前的fcntl()实现基于以下链接中的代码:

如何将套接字重置回阻塞模式(在将其设置为非阻塞模式之后)?

//set socket to NONBlocking
on = fcntl(Socket,F_GETFL);
on = (on | O_NONBLOCK);
if(fcntl(Socket,F_SETFL,on) < 0)
    {
       perror("turning NONBLOCKING on failed\n");
    }

// DO CONNECT
rc = connect()

感谢您抽出时间查看此内容。
2个回答

6

您应该在需要时设置O_NONBLOCK。如果在connect之前设置,那么connect也将是非阻塞的(返回EINPROGRESS;您可以selectpoll等待其完成后再写入)。


有没有一种方法可以检查并确保它正在运行? - WorkerBee
你是想检查还是确保它开启?无论如何,这就是你使用 F_GETFL 的方式(在 on = fcntl(...) 之后可以插入“检查”逻辑)。 - Anton Kovalenko
当我打开O_NONBLOCK时,会出现“无效参数”和“I/O错误”(22,5)。打开O_NONBLOCK会影响我的连接吗?当我注释掉on = fcntl(Socket,F_GETFL);on = (on | O_NONBLOCK);时,它可以正常工作。 - WorkerBee
你从哪里得到这些错误?肯定不是来自 fcntl 吧?你能提供一个完整的示例吗? - Anton Kovalenko

0

回答第二部分,使用相同的代码,但关闭O_NONBLOCK位,而不是打开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接