Tag: nonblocking

UV_RUN_NOWAIT模式如何在libuv中工作?

使用uv_run函数在libuv中运行事件循环时,会出现一个与以下值一起使用的“mode”参数: UV_RUN_DEFAULT UV_RUN_ONCE UV_RUN_NOWAIT 前两个是显而易见的。 UV_RUN_DEFAULT运行事件循环,直到没有更多事件,并且UV_RUN_ONCE处理来自循环的单个事件。 但是, UV_RUN_NOWAIT似乎不是一个单独的模式,而是一个可以与其他两个值之一进行OR运算的标志。 默认情况下,此函数会阻塞,直到事件处理UV_RUN_NOWAIT ,并且UV_RUN_NOWAIT使其无阻塞,但我可以在其上找到的任何文档都在那里结束。 我的问题是,如果你运行事件循环非阻塞,如何处理回调? libuv事件模型是单线程的(reactor模式),所以我假设它需要阻塞才能调用回调,但如果主线程被占用,事件处理后会发生什么? 在libuv再次控制主线程之前,回调是否会“排队”? 或者是否会在另一个线程上调度回调?

在非阻塞套接字连接中,select()始终返回1

我有这个代码段,旨在使用套接字连接连接到服务器。 但是,如果它无法在一定时间内连接到服务器,我希望它停止尝试。 我尝试使用这个非阻塞套接字和select命令执行此操作,但select总是返回1,表示当我提供的地址不存在时服务器存在。 有任何想法吗? SOCKET tcp_client( char *hname, char *sname ) { fd_set fdset; struct sockaddr_in peer; SOCKET s; FD_ZERO(&fdset); // FD_SET(STDIN, &fdset); FD_SET(s, &fdset); errno=1; struct timeval tv; tv.tv_sec = 15; set_address( hname, sname, &peer, “tcp” ); s = socket( AF_INET, SOCK_STREAM, 0 ); int n = 1; fcntl(s, F_SETFL, O_NONBLOCK); if ( !isvalidsock( […]

如何检查stdin是否仍然没有阻塞打开?

我需要用纯C编写的程序在stdin关闭时停止执行。 在程序主循环中有不确定的工作,并且我无法在那里使用阻塞检查(如getc() )(没有数据应该到达stdin – 它只是在未知时间保持打开状态)。 我打算在实现inetd,xinetd或其类似物中托管的网络守护程序时使用所描述的function – 它应该在连接保持打开时在stdout上发出数据,并在关闭时正确完成工作。 现在我的程序被托管服务杀死,因为它在连接终止后不会停止。 我想知道将带有O_NONBLOCK标志的fctntl()应用于stdin描述符是否允许我在非阻塞模式下使用read()函数? 我应该以某种方式使用select()吗? PS数据不是假定的,但可能会到达stdin。 一种非阻塞读出方式应该是问题的答案。

对OpenSSL非阻塞I / O感到困惑

通常,OpenSSL库(C API)似乎提供了两种方法来执行所有操作:您可以使用根据自己的喜好配置的普通系统套接字,也可以使用类似于流的OpenSSL BIO对象。 但是,我经常对一些重复的function感到困惑。 例如,如何使SSL连接无阻塞? 一种方法似乎是简单地访问底层文件描述符并使用fcntl将其设置为非阻塞。 但是还有一个名为BIO_set_nbio的OpenSSL API BIO_set_nbio ,它接收一个BIO*对象并将其设置为非阻塞模式。 那么设置非阻塞SSL套接字的最佳方法是什么? 如果您将OpenSSL传递给已通过fnctl设置为非阻塞模式的本机文件描述符会发生什么? 你还需要专门调用BIO_set_nbio来使BIO对象无阻塞吗?