epoll 和多次连接尝试有什么区别?

What is the difference between epoll and multiple connect attempt?

提问人:Ahsan Sadeeb 提问时间:7/28/2022 更新时间:7/28/2022 访问量:59

问:

假设我有一个非阻塞 TCP 客户端套接字。我想连接到 TCP 服务器。我发现可以使用以下任何一种方式来做到这一点。

int num_of_retry=5;
for(int i=0;i<num_of_retry;i++){
   connect(SOCKET_FD,...);
   sleep(1000ms);
}

和这个

connect(SOCKET_FD,...);
epoll_wait(...,5000ms)

上述两种方法的主要区别是什么,性能和其他方法?

C++ 套接字网络 TCP IO

评论

0赞 user253751 7/28/2022
请注意,您可以一次对多个内容进行电子轮询
0赞 user207421 7/28/2022
这里的区别在于第一个示例不起作用。即使之前的连接尝试失败,也无法重新连接 TCP 套接字。您必须关闭它并创建一个新的。这就是让你不必做的原因。它还阻塞了正确的时间,这与你的尝试/睡眠/旋转循环不同。epoll()

答:

2赞 Remy Lebeau 7/28/2022 #1

在此特定示例中,主要区别在于,在经过完整间隔之前不会退出,而如果挂起的连接操作在完整间隔结束之前完成,则(并且)也会更早退出。sleep()epoll()select()

否则,这两个示例都会阻塞调用线程,直到发生某些事情(这有点违背了使用非阻塞套接字的目的 - 除了此方法是使用 )实现超时的唯一方法。connect()

请注意,在任一示例中,如果在套接字已经在连接时调用套接字,则将失败并显示错误。如果连接操作超时,则应在再次调用之前使用套接字并创建一个新套接字。你应该等待(或)告诉你操作何时完成,不要只是调用一个循环,直到它报告除 .connect()connect()EALREADYclose()connect()epoll()select()connect()EALREADY