c - 是否可以在接受事件时执行 epoll?

标签 c sockets posix epoll

假设我已经创建了一个监听套接字:

sock = socket(...);
bind(sock,...);
listen(sock, ...);

是否可以在 sock 上执行 epoll_wait 以等待传入连接?之后如何获取客户端的套接字 fd?

我正在为套接字编写的平台不能是非阻塞的,但是有超时的工作 epoll 实现,我需要接受连接并在单个线程中使用它,这样它就不会如果出现问题并且无法连接,则挂起。

最佳答案

如果不知道这个非标准平台是什么,就不可能确切地知道他们给 epoll 调用的语义是什么。但是在 Linux 上的标准 epoll 上,当传入连接到达时,监听套接字将被报告为“可读”,然后您可以通过调用 accept 来接受连接。如果您让套接字处于阻塞模式,并在每次调用 accept 之前始终使用 epoll 的级别触发模式检查可读性,那么这应该可以工作——唯一的风险是如果您在没有连接到达时以某种方式最终调用 accept,那么您将陷入困境。例如,如果有两个进程共享一个监听套接字,并且它们都尝试接受 相同的连接,则可能会发生这种情况。或者,如果传入连接到达,然后在您调用 accept 之前再次关闭,则可能会发生这种情况。 (很确定在这种情况下 Linux 仍然允许 accept 成功,但这种边缘情况正是我怀疑一个奇怪的平台在做一些奇怪的事情的地方。)你想检查这些东西。

非阻塞模式更可靠,因为在最坏的情况下,accept 只是报告没有什么可以接受。但如果那不可用,那么您也许可以摆脱这样的事情......

关于c - 是否可以在接受事件时执行 epoll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788263/

相关文章:

比较两个字符串,字典程序

c - fcntl F_GETLK 始终返回 F_UNLCK

java - 服务器无法从客户端 java 接收文本

c - fgets()、信号 (EINTR) 和输入数据完整性

C-POSIX : Shared Memory

c - for循环忽略条件

c - 主函数包含对 exit() 和 pthread_exit() 的调用。这两个调用在执行时的效果会有什么不同?

Java 服务器套接字卡在接受调用(Android 客户端、Java 服务器)

c - 我如何告诉套接字在不关闭它的情况下丢弃所有未决数据?

c - 如何复制 pthread_attr_t?