假设我已经创建了一个监听套接字:
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/