2013-06-18 86 views
0

我有InetAddress.getLocalHost()。getHostAddress问题()。它在大多数机器上都能正常工作,但是在有更多IP地址可用的情况下(在这种情况下,“错误的”地址属于VMware网络适配器)失败。我需要将地址放入消息中(然后在服务器上将其用作响应应发送到的地址)。如何找出“正确的”IP地址?

我知道,我可以用NetworkInterface.getNetworkInterfaces()来获取所有的网络接口,但我怎么可以编程找到合适的人也就是后来看到服务器?在我的特殊情况下,客户端和服务器都位于同一公司网络内。

+0

我不认为你所要求的是可能的 - 事实上,我认为它是纯不可能的,因为虚拟机并不知道,和不知道(除非潜藏着安全漏洞)这样的事情。 – fge

+0

我不是在网络接口很好,但它真的不可能的计算机,找到从它的IP地址是用来进入机器从其他机器? – GUZ

+0

“我需要将地址放入消息中(然后在服务器上将其用作响应应发送到的地址)”。为什么?服务器已经知道用什么客户端套接字地址和端口连接到它。 – EJP

回答

1

如果所有机器都在同一个网络中,且该网络有它的IP范围,您可以检查IP是在这个范围内。通常,vmware网络适配器的IP地址在192.168.0.x子网中 - 如果您的公司范围不同,那么它应该足够了。

+0

可惜这不是在同一子网:例如服务器地址以172开始,有问题的客户端193 – GUZ

+0

你知道计算机的名称如果是的话,你可以使用的工具?例如'nslookup','nmap'如果你知道你的DNS服务器的IP,你可以使用'arp-scan'来列出连接的IP地址 – maialithar

0

也许下面的类,以帮助IP

public enum IpAddressHelper 
{ 

    X_FORWARDED_FOR("X-Forwarded-For"), 
    PROXY_CLIENT_IP("Proxy-Client-IP"), 
    WL_PROXY_CLIENT_IP("WL-Proxy-Client-IP"), 
    HTTP_CLIENT_IP("HTTP_CLIENT_IP"), 
    HTTP_X_FORWARDED_FOR("HTTP_X_FORWARDED_FOR"); 

    private static final Logger LOGGER = LoggerFactory.getLogger(IpAddressHelper.class); 
    private static final String REMOTE_ADDR = "REMOTE_ADDR"; 
    private String key; 

    /** 
    * @param key 
    */ 
    IpAddressHelper(String key) 
    { 
     this.key = key; 
    } 

    /** 
    * @return the key 
    */ 
    public String getKey() 
    { 
     return key; 
    } 

    public static String getClientIpAddr(HttpServletRequest request) 
    { 

     String ip = null; 
     for (IpAddressHelper header : IpAddressHelper.values()) 
     { 
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) 
      { 
       ip = request.getHeader(header.getKey()); 
       LOGGER.info("tried:" + header); 
      } 
     } 

     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) 
     { 
      ip = request.getRemoteAddr(); 
     } 

     return ip; 
    } 

    public static String getClientIpAddr(Map<String, String> requestHeaders) 
    { 
     String ip = null; 
     for (IpAddressHelper header : IpAddressHelper.values()) 
     { 
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) 
      { 
       ip = requestHeaders.get(header.getKey()); 
       LOGGER.info("tried:" + header); 
      } 
     } 

     if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) 
     { 
      ip = requestHeaders.get(REMOTE_ADDR); 
     } 

     return ip; 
    } 
} 
+0

这只适用于HTTP ... – fge

+0

我正在使用socket通信不是HTTP遗憾的是它没有太大的帮助:( – GUZ

+0

@GUZ,好吧,所以我将谁可能使用把这个留给人们HTTP – Pheonix