【问题标题】:Different IP Addresses from the same machine同一台机器的不同IP地址
【发布时间】:2018-03-29 13:08:18
【问题描述】:

我有一个客户端-服务器设置。客户端连接到服务器并询问接下来要执行哪个程序。服务器在收到请求后使用以下代码块检查套接字另一端的主机名,该代码返回“127.0.0.1”

socket.getInetAddress().getCanonicalHostName();

在获取程序名称后,客户端创建一个进程,该进程也尝试连接到服务器,但这次上述调用返回不同的地址。 "mypc.foo.com" 在这里屏蔽域名

这种行为困扰着我,因为我无法在 hashmap 中查找我存储按机器 ip 分组的所有进程详细信息的位置。

这是 java 查找实现中的错误还是我遗漏了什么。请提出其他方法来进行此查找

【问题讨论】:

    标签: java networking dns


    【解决方案1】:

    我相信 socket.getInetAddress() 返回您自己的地址,所以基本上总是 127.0.0.1。尝试使用socket.getRemoteSocketAddress() - 获取对方的ip地址。

    不过,使用 IP 地址来匹配不同的用户通常是个坏主意。首先,它们可以在某个网络中或在防火墙后面,并且您可以从来自同一 IP 地址的多个客户端获取请求。此外,您不能保证它是静态或动态 IP。此外,如果您的应用程序在具有奇怪路由的奇怪网络设置中运行,您最终可能会收到来自路由器 IP 地址的所有请求。

    更好的设计是在服务器和客户端之间共享一些令牌并将其用于识别。听起来很熟悉吗?例如 http 会话就是这样完成的;)

    【讨论】:

    • 是的!我想到了..但我们也可以恶搞它对吗?
    • @MadhusoodanP 所以你担心客户欺骗他的令牌,但不担心 IP 地址操纵?如果是这样,那真的不适合。
    • 但是它增加了管理令牌的额外复杂性,但是服务器有时也会连接回客户端以终止进程(是的,首先连接的客户端也侦听端口:P)。所以我相信使用 IP 地址是更好的方法。 (请纠正我)
    • 没关系,但它增加了对基础架构的一些依赖。想象一下,您有一个本地网络,其中有 5 台机器从同一路由器连接到 Internet。您的服务器远程位于 Internet 中。所有这些机器都会向您显示它们的路由器/共享 IP 地址或它们的本地网络地址,在这两种情况下它都不适合您。此外,如果您有一些硬件防火墙或负载平衡器或设置不当的路由器或网络中的任何东西,您将始终获得他们的 IP。如果您需要重新连接,那么在这种情况下使用令牌也不会好多少
    • 好吧,让我再上一层抽象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多