调用net.DialTimeout函数时给定的超时时间意味着什么?

64 阅读1分钟

简单来说,这里的超时时间,代表着函数为网络连接建立完成而等待的最长时间。这是一个相对的时间。它会由这个函数的参数timeout的值表示。 开始的时间点几乎是我们调用net.DialTimeout函数的那一刻。在这之后,时间会主要花费在“解析参数network和address的值”,以及“创建 socket 实例并建立网络连接”这两件事情上。 不论执行到哪一步,只要在绝对的超时时间达到的那一刻,网络连接还没有建立完成,该函数就会返回一个代表了 I/O 操作超时的错误值。 值得注意的是,在解析address的值的时候,函数会确定网络服务的 IP 地址、端口号等必要信息,并在需要时访问 DNS 服务。 另外,如果解析出的 IP 地址有多个,那么函数会串行或并发地尝试建立连接。但无论用什么样的方式尝试,函数总会以最先建立成功的那个连接为准。 同时,它还会根据超时前的剩余时间,去设定针对每次连接尝试的超时时间,以便让它们都有适当的时间执行。 再多说一点。在net包中还有一个名为Dialer的结构体类型。该类型有一个名叫Timeout的字段,它与上述的timeout参数的含义是完全一致的。实际上,net.DialTimeout函数正是利用了这个类型的值才得以实现功能的。 此文章为10月Day06学习笔记,内容来源于极客时间《go语言核心36讲》,强烈推荐该课程