Tag: 非阻塞

如何在Windows上无阻塞地读取可用输入

在Linux上,我可以在不阻止进程的情况下读取可用输入: fcntl(STDIN_FILENO, F_SETFL, fcntl(STDIN_FILENO, F_GETFL, 0) | O_NONBLOCK ) char buf[n]; int r = fread(buf, 1, n, stdin); if (r == 0){ printf(“nothing\n”); } else { printf(“read: “); fwrite(buf, 1, r, stdout); printf(“\n”); } 输入源可以是任何东西,例如文件,终端或管道。 我怎么能在Windows XP上做到这一点? 谢谢。

非阻塞套接字在C中没有自旋锁接受

可能重复: 唤醒线程在accept()调用时被阻塞 我正在编写一个小型服务器,它监听连接(接受它们并将它们传递给工作线程),直到发送自定义停止信号。 如果我使用阻塞套接字,那么我的主接受循环不会破坏正在发送的自定义停止信号。 但是,我希望避免使用带有非阻塞套接字的busy-wait / spinlock循环。 我想要的是我的主接受循环阻止,直到收到连接或发送停止信号。 这可能在Linux上的C? 非常感谢。

套接字:什么导致read()返回EINVAL?

套接字客户端程序与服务器建立连接,写入一些字节并使用(阻塞) read()等待响应。 但这失败了,错误是EINVAL (“无效参数”)。 以前对socket create() , bind()和connect()的调用已成功完成。 我的问题 这有什么不对? 平台是Linux x64。

在基于epoll的服务器中超时空闲连接

我在c中编写了一个tcp服务器,它使用epoll()i / o多路复用来管理并发连接。 我想超时空闲超过允许时间的连接。 到目前为止,我保留了与每个连接关联的last_active time_t变量,我将其更新为事件处理程序中的当前时间。 在此之前,我检查自上次事件以来是否超过允许的时间,如果是,我终止连接。 到目前为止一切都那么好,但它并不是我想要的,因为超时仅在第一个超时事件中触发,但如果连接保持不活动状态,我的代码在它再次变为“活动”之前不会检测到它。 我在基于select()的服务器中看到这种方式的方法是在事件循环的每次迭代期间线性遍历兴趣集并清除那里的非活动连接。 这在选择中不是问题,因为你已经必须进行此遍历,但我正是使用epoll()来避免必须这样做。 如果我这样做,epoll并不比选择更好。 我也查看了套接字选项,我发现最接近的是SO_RCVTIMEO,这使得read()/ recv()如果等待超过指定时间则返回错误。 但由于我正在使用i / o多路复用并且套接字处于非阻塞模式,因此不会阻塞,因为套接字不会阻塞。 我很感激有关如何解决这个问题的任何见解。 非常感谢你。

为WinSocks和* nix创建一个非阻塞套接字

在C / C ++中,如何将阻塞套接字转换为WinSocks和* nix中的非阻塞套接字; 这样select()才能正常工作。 您可以将预处理器用于特定于平台的代码。

O_NONBLOCK是否设置了文件描述符或基础文件的属性?

从我在Open Group网站上read fcntl , open , read和write ,我得到的印象是O_NONBLOCK是否设置在文件描述符上,因此非阻塞I / O是否与描述符一起使用,应该是该文件描述符的属性而不是底层文件。 例如,作为文件描述符的属性意味着,如果我复制文件描述符或打开另一个描述符到同一文件,那么我可以使用阻塞I / O和一个非阻塞I / O与另一个。 然而,尝试使用FIFO,似乎不可能同时为FIFO提供阻塞I / O描述符和非阻塞I / O描述符(因此,是否设置O_NONBLOCK是基础文件的属性[FIFO] ]): #include #include #include #include #include int main(int argc, char **argv) { int fds[2]; if (pipe(fds) == -1) { fprintf(stderr, “`pipe` failed.\n”); return EXIT_FAILURE; } int fd0_dup = dup(fds[0]); if (fd0_dup <= STDERR_FILENO) { fprintf(stderr, […]

连接到套接字时似乎无法使超时工作

我正在尝试为connect()提供超时。 我四处搜寻,发现了几篇与此相关的文章。 我编写了我认为应该工作的内容,但不幸的是我没有从getsockopt()报告错误。 但是当我来到write()时,它失败了,错误是107 – ENOTCONN。 几点。 我在Fedora 23上运行.connect()的文档说它应该返回失败的EINPROGRESS错误,因为连接尚未完成但是我遇到了EAGAIN所以我将其添加到我的支票中。 目前我的套接字服务器在listen()调用中将backlog设置为零。 许多调用成功但是那些失败的调用都失败了107 – 我在write()调用中提到的ENOTCONN。 我希望我只是遗漏了一些东西,但到目前为止还无法弄清楚是什么。 int domain_socket_send(const char* socket_name, unsigned char* buffer, unsigned int length, unsigned int timeout) { struct sockaddr_un addr; int fd = -1; int result = 0; // Create socket. fd = socket(AF_UNIX, SOCK_STREAM, 0); if (fd == -1) { result = -1; […]

启用非阻塞套接字

我有一个用C / C ++编写的服务器。 我为连接设置了包装器,如下所示: //START WRAPPER void Server::init_address(int port) { memset(&(this->serv_addr), 0, sizeof(this->serv_addr)); this->serv_addr.sin_family = AF_INET; this->serv_addr.sin_port = htons(port); this->serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); } int Server::w_socket() { int retv; retv = socket(PF_INET, SOCK_STREAM, 0); //FIXME //fcntl(retv, F_SETFL, O_NONBLOCK); if(retv == -1) { std::string err_msg(strerror(errno)); err_msg = “[socket] ” + err_msg; throw err_msg; } else { […]

使用select()进行非阻塞套接字连接始终返回1

这个问题非常相似(或几乎完全相同) 在非阻塞套接字连接中,select()总是返回1 ; 但是,我似乎无法找到我的代码蹒跚的地方。 我正在使用非阻塞套接字,并希望在将客户端连接到服务器时使用select()来检查超时/成功。 问题是select()总是几乎立即返回1,即使我甚至没有服务器运行,也没有什么可以连接到。 在此先感谢您的帮助,代码段如下: //Loop through the addrinfo structs and try to connect to the first one we can for(p = serverinfo; p != NULL; p = p->ai_next) { if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { //We couldn’t create the socket, try again perror(“client: socket”); continue; } //Set the socket […]

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

关于将套接字设置为非阻塞模式,我已经读过这个。 http://www.gnu.org/software/libc/manual/html_mono/libc.html#File-Status-Flags 这是我做的: static void setnonblocking(int sock) { int opts; opts = fcntl(sock,F_GETFL); if (opts < 0) { perror("fcntl(F_GETFL)"); exit(EXIT_FAILURE); } opts = (opts | O_NONBLOCK); if (fcntl(sock,F_SETFL,opts) < 0) { perror("fcntl(F_SETFL)"); exit(EXIT_FAILURE); } return; } 如何将套接字设置回阻止模式? 我没有看到O_BLOCK标志? 谢谢。