gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:19:55 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com