【问题标题】:Why can't my socket programs connect to the internet?为什么我的套接字程序无法连接到互联网?
【发布时间】:2011-06-07 06:06:17
【问题描述】:

这学期我开始了我的第一门网络课程。 我的问题是,每当我尝试将我的套接字连接到局域网外的主机时, 返回网络不可达错误。它们是 BSD 套接字还是 Java 套接字。 此外,我的 nmap 探针也返回相同的错误。 有一次我在这里问了一个关于 ping 探测的类似问题,答案是我的 LAN 代理正在拒绝 ICMP 请求。但是在建立 TCP 连接时没有 ICMP 请求,对吧? 为什么,另一方面,我的浏览器可以连接到任何主机......虽然它使用相同的代理...... 另外,(请原谅我这个长期的疑问)当我在我的套接字中将主机名指定为 www.google.com 时,会返回“未知主机”。但我的浏览器很乐意识别同一个主机。

提前谢谢你...

import java.net.*;
import java.io.*;

class Whois {
public static void main(String args[]) throws Exception{
    int c;
    Socket s=new Socket(args[0],Integer.parseInt((args[1])));
    InputStream in=s.getInputStream();

    while( (c=in.read()) != -1) {
        System.out.print((char) c);
    }
    s.close();
}
}

【问题讨论】:

  • 浏览器在通过的80端口上运行;而我的猜测是您的套接字正在被阻塞的端口上运行。
  • 我也试过 80 端口。同样的错误
  • 你可能需要发布一些代码,因为它可能是任意数量的东西。
  • 将代码放入问题本身。在 cmets 中不可读。
  • 忍受我。我对编程论坛有点陌生...

标签: sockets networking


【解决方案1】:

很遗憾,这种行为可能有很多原因。

我最好的办法是你在防火墙后面,它阻止了任何不去端口 80 的连接。在这种情况下,你可以尝试将你的程序连接到同一个网络,但端口 80。

不知道为什么您不会获得 google 的名称解析。我猜这是你的代码中的一个错误,但不能确定。

希望对您有所帮助。

【讨论】:

  • 我尝试了 80 端口...同样的错误。我从 The Complete Reference 复制了 Whois 程序,没有出现错误的机会。请解释
【解决方案2】:

调查并了解您的网络设置。您是如何连接到互联网的?您的工作站可能有一个 default route 指向某台机器,它可能再次执行 Network Address Translation (NAT) 和/或运行 firewall 和可能是 proxy 服务器。了解您的工作方式name resolution (DNS)。如果你弄清楚了这些,你可能会发现你需要做些什么才能与外界联系。

另一方面,我们在问题中没有看到的代码中的错误也很可能:)

【讨论】:

  • 是的,它在防火墙后面。但我的主要疑问是为什么我的浏览器建立 TCP 连接没有问题。我尝试了80端口,返回同样的错误
  • 您的浏览器是否设置了代理?什么样的?
  • 是的,浏览器是通过代理连接的。与系统代理设置相同。
  • 然后浏览器与本地代理对话,代理连接到真实站点。有一些方法可以使用它,但它与初学者套接字编程无关。只需在本地机器上运行客户端和服务器,连接到127.0.0.1,这是环回接口
  • 所以可以做到...非常感谢您的回复。我想我明白了。浏览器以允许的方式向代理发出请求。我的程序的请求被阻止了。
【解决方案3】:

可能有一个防火墙阻止了与外部主机的所有连接,以及一个不查找外部主机名的内部 DNS 服务器。这就是为什么您的套接字程序既不能查找外部主机名也不能连接到外部服务的原因。

同样的限制适用于您的浏览器;只是您的浏览器设置为使用代理服务器。这意味着浏览器不直接查找外部主机名或连接到外部主机 - 它只是查找代理名称并与代理服务器建立 TCP 连接。然后,代理会代表您的浏览器进行主机名查找并与外部世界建立 TCP 连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多