首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当路由器无法连接到互联网时连接功能块

当路由器无法连接到互联网时连接功能块
EN

Stack Overflow用户
提问于 2015-02-08 10:44:02
回答 1查看 60关注 0票数 0

我使用的是C语言中的基本套接字函数,如下所示:

代码语言:javascript
复制
int res = connect(sock_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));

  1. 当我的笔记本电脑处于离线状态时,connect将立即返回,连接已按预期建立。
  2. 当我的笔记本电脑离线时,connect将立即返回,错误号为“ is connect我的笔记本电脑已连接到无法直接访问互联网的wifi网络(需要登录操作或其他操作),connect将在返回前20秒左右阻塞,错误号为"connection

可以通过设置sock_fd非阻塞来解决,我想知道为什么在第三种情况下connect需要这么长时间才返回连接错误?

EN

回答 1

Stack Overflow用户

发布于 2015-02-08 12:02:47

在第二种情况下(网络离线),操作系统知道它是离线的,因此网络库可以立即发出故障信号。

在第三种情况下(网络在线,但无法连接到互联网),操作系统认为它是在线的,但无法提前知道连接不会成功。实际故障模式取决于您所连接的网络的性质:

  • 在您遇到的情况下,网络根本没有响应您的连接尝试。您的数据包只是被忽略了。最终,当connect函数放弃等待响应时,您会遇到连接超时。在放弃之前等待一段时间是正常的,因为并非互联网上的所有连接都立即发生(网络缓慢或拥塞,或者另一端的服务器响应缓慢)
  • 在另一种情况下,防火墙可能被配置为主动拒绝不允许的连接。这意味着它将发回一个数据包作为响应,表明连接已被拒绝。如果发生这种情况,您很快就会从connect()返回错误。
  • 还有第三种可能性...在这种情况下,您连接到的网络要求您在网页上输入密码,或者单击确认您已确认该企业的互联网使用策略。无论您尝试使用浏览器访问哪个互联网站点,您都会首先看到此页面。这称为强制网络门户,通过响应任何IP地址的端口80流量并发送登录页面来实现。如果您尝试将套接字连接到任何IP地址上的端口80 ( http端口),则连接将会成功(即使您实际上没有连接到您期望的远程服务器)。如果您使用的端口不是端口80,它将忽略或阻止该连接。我提到这一点,以防你正在尝试编写一个程序,以确定你是否连接到互联网。在这种情况下,使用端口80不能很好地工作。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28390017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档