这是一个关于伯克利套接字的问题。
通常情况下,客户端会通过调用该函数连接到服务器connect()
,并假设目标机器可达并且目标机器上的应用程序已经通过调用该listen()
函数进入监听状态,从而建立连接。这还假设客户端正在尝试连接到正确的端口,并且服务器正在侦听该端口号。
我的问题是如果由于外部原因connect()
失败会发生什么?内部原因可能是没有足够的可用资源,例如端口已在使用中,或者系统内存不足等。
connect()
我想到的可能失败的两个重要外部原因是:
- 目标机器IP地址不可达(没有到主机的路由,或者没有到网络的路由等)
- 目标计算机在预期端口号上没有打开的侦听端口。(很可能监听服务器应用程序没有运行)
出现这个问题的原因是在内部原因失败的情况下,这些事情很可能在任何函数或系统调用返回时就已经知道了。
- 例如,如果应用程序尝试访问
connect()
主机并且所需的系统资源不可用,则调用connect()
可能会在函数返回时返回错误代码。可能是这种情况,因为connect()
可能会通过 OS 系统调用与 OS 产生一些交互,并且这些系统调用将返回指示问题的错误代码。
另一方面,一旦消息/数据包从网络接口发送出去,关于这是否成功的信息将在一段时间内不知道。
- 在网络不可达的情况下,操作系统可能会提前知道它无法将 IP 流量路由到某个子网,因为没有到该子网的已知路由。但它可能不会。“duckduckgo.com”可能在 5 分钟前可以访问,现在可能由于某种原因无法访问。
- 即使操作系统在从网络接口发送数据包之前知道数据包可以路由到主机,它也不知道该数据包在途中会发生什么。(被防火墙过滤?主机可能没有打开和监听某个端口?)
在这种情况下,会发生什么?我假设该connect()
函数必须返回,但即使即将发生错误也可能返回而没有错误。(由于外部原因,如上所述。)
这个问题的原因是我试图找出解决我正在开发的应用程序问题的最佳方法,其中用户输入了一个不存在或不响应的服务器的 IP 地址。目前,我对如何connect()
在不知道如何处理的情况下如何工作知之甚少。
我应该补充一点,例如,我也不知道这是否在某些规范中定义,或者这是否是未定义的行为或取决于操作系统。