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

时间:2015-02-08 02:44:02

标签: c sockets network-programming

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

int res = connect(sock_fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in));

1。当我的笔记本电脑可以访问互联网时,connect将立即返回,连接按预期建立 2.当我的笔记本电脑离线时,connect将立即返回,错误是"网络无法访问。
3.当我的笔记本电脑连接到无法直接访问互联网的wifi网络时(需要登录操作或其他),connect将在返回前约20秒阻止,错误是#34;连接被拒绝"
它可以通过设置sock_fd非阻塞来解决,我想知道为什么在connect在第三种情况下返回连接错误需要这么长时间?

1 个答案:

答案 0 :(得分:1)

在第二种情况下(网络脱机),操作系统知道它处于脱机状态,因此网络库可以立即发出故障信号。

在第3种情况下(网络在线,但无法访问互联网)操作系统认为它在线,但无法预先告知连接不会成功。实际的故障模式取决于您所连接的网络的性质:

  • 在您遇到的情况下,网络根本没有对您的连接尝试做出响应。您的数据包只是被忽略了。当connect函数放弃等待响应时,最终会遇到连接超时。在放弃之前等待一段时间是正常的,因为互联网上的所有连接都不会立即发生(网络缓慢或拥塞,或者另一端的服务器响应缓慢)

  • 在另一种情况下,防火墙可能配置为主动拒绝不允许的连接。这意味着它会在响应中发回一个数据包,表示连接被拒绝。如果发生这种情况,您很快就会从connect()中收到错误。

  • 还有第三种可能性......这种情况是您连接到需要您在网页上输入密码的网络,或者单击以确认您确认使用互联网的政策在那个行业。无论您尝试使用浏览器访问哪个互联网网站,您都会首先看到此页面。这称为强制门户,通过响应任何IP地址的端口80流量并发送登录页面来实现。如果您尝试将套接字连接到任何IP地址的端口80(http端口),则连接将成功(即使您实际上未连接到您期望的远程服务器)。如果您使用的是端口80以外的端口,则会忽略或阻止连接。如果您正在尝试编写一个程序来确定您是否连接到互联网,我会提到这一点。在这种情况下,使用端口80将无法正常工作。