【问题标题】:when exactly we get error ENETUNREACH with connect function call in linux当我们在 linux 中通过 connect 函数调用得到错误 ENETUNREACH
【发布时间】:2021-05-12 05:44:50
【问题描述】:

我的系统,它是一个客户端尝试连接到(身份验证)服务器。所以到服务器的路由应该是可用的,我们尝试连接到 用于验证端口的服务器。我们有启动配置文件,该文件具有动态学习到服务器的路由的配置 并配置通过连接到服务器来验证端口。

启动配置在重启时使用。

当我重新启动系统并在重新启动时调用连接函数时,它有时会返回错误 ENETUNREACH,最初我认为这是因为 当连接被调用时,到服务器的路由还不可用,所以为了重现它,我总是删除了配置部分 学习到服务器的路由,令我惊讶的是,它只是有时可以重现。未复制时(连接返回成功) 我尝试配置到服务器的路由并与服务器开始通信

那么connect函数返回的错误ENETUNREACH究竟是什么时候? 为什么没有到服务器的路由可用时连接返回成功?

套接字类型是 SOCK_DGRAM setsockopt SO_REUSEADDR & SO_REUSEPORT 设置为 1

调试此问题的任何其他指针都会有所帮助。

【问题讨论】:

  • ENETUNREACH 表示没有找到路线。
  • @stark 这不正确。这将返回 ENOROUTETOHOST。 ENETUNREACH 表示未找到连接到已找到的路由的接口。

标签: linux sockets


【解决方案1】:

我可以找出错误 ENETUNREACH 的原因

这是因为既不是默认路由也不是到目的地的路由 在连接呼叫时可用

任何一个可用的连接调用都会成功

【讨论】:

    【解决方案2】:

    为什么您对 SOCK_DGRAM (UDP?) 类型的套接字使用连接调用?似乎您的目的地还没有准备好,因此您正在获得 ENETUNREACH,如果它无法到达,那么您可能已经获得了 ENETDOWN

    【讨论】:

    • 这应该是评论,而不是答案。
    • 这是不正确的。 UDP 连接不关心目的地是否准备好。答案似乎只是猜测。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 1970-01-01
    • 2019-11-05
    相关资源
    最近更新 更多