Linux下epoll中Socket连接进行时getpeername的行为疑问
关于非阻塞Socket连接进行中时getpeername的行为
- 核心结论:当调用
connect()后连接处于进行中状态(通常是非阻塞Socket下返回EINPROGRESS的场景)时,调用getpeername()会返回-1,同时errno会被设置为ENOTCONN,明确表示Socket尚未建立有效连接。 - 补充说明:
- 若连接最终成功建立,后续再次调用
getpeername()即可正常获取对等方的地址信息。 - 若连接失败,可通过
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len)获取具体错误码,此时getpeername()同样会返回-1。
- 若连接最终成功建立,后续再次调用
- 对超时关闭方案的建议:
- 单纯依赖计数器判断超时可行,但结合
select()或poll()监听Socket的可写事件会更可靠——当Socket变为可写时,再通过SO_ERROR检查连接是否成功,能及时处理连接完成或失败的情况,避免不必要的等待。 - 如果坚持使用计数器,需注意在超时后先通过
SO_ERROR确认连接仍处于进行中,再关闭Socket,避免误关已经成功建立的连接。
- 单纯依赖计数器判断超时可行,但结合
内容的提问来源于stack exchange,提问作者Noah Barcomb
相关产品推荐
相关产品推荐

