2015-02-08 83 views
0

我使用C语言的基本socket函数,下面的命令:连接功能块时,路由器不能conncet互联网

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

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

回答

1

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

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

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

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

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

+0

谢谢,你能推荐一些能帮助我深入挖掘的书吗? – nzomkxia 2015-02-08 12:36:50