2

鉴于我的 Android 设备在同一网络上的计算机的 IP 地址,我必须找到它的 NetBIOS/FQDN 名称......有没有任何“干净”的解决方案可以用 Android SDK 完成这个并且一般来说在 java 中?

显然 InetAddress.get*HostName 不返回 NetBIOS 名称:)

4

3 回答 3

5

您可以使用JCIFS开源库。

 InetAddress addr = NbtAddress.getByName( "hostname" ).getInetAddress();

双向工作,IP 地址到主机名,反之亦然。

于 2012-10-19T01:41:38.743 回答
4

实际上,汤姆提供的代码不起作用,这段代码对我有用(使用 JCIFS lib。)

NbtAddress[] nbts = NbtAddress.getAllByAddress("IP ADDRESS AS STRING");
String netbiosname = nbts[0].getHostName();

如果成功,则将 NetBios 设备名称作为字符串返回;如果目标不存在或没有 NetBios 名称,则抛出 UnknownHostException。

于 2015-04-29T19:02:07.700 回答
0

试试这个...

import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class SearchNetBIOSName {

    public static void main(String[] args) {
        try {
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.PROVIDER_URL, "ldap://my.domain.com:389");
            env.put(Context.SECURITY_AUTHENTICATION, "simple");
            env.put(Context.SECURITY_PRINCIPAL, "cn=administrator,cn=users,dc=my,dc=domain,dc=com");
            env.put(Context.SECURITY_CREDENTIALS, "********");
            LdapContext context = new InitialLdapContext(env, null);
            String searchBase = "cn=Partitions,cn=Configuration,dc=my,dc=domain,dc=com";
            String searchFilter = "(&(objectcategory=Crossref)(netbiosname=*))";
            SearchControls controls = new SearchControls();
            controls.setSearchScope(SearchControls.ONELEVEL_SCOPE);
            NamingEnumeration answers = context.search(searchBase, searchFilter, controls);
            while (answers.hasMore()) {
                SearchResult rs = (SearchResult) answers.next();
                String netBiosName = rs.getAttributes().get("NetBIOSName").get(0).toString();
                System.out.println(netBiosName);
            }
            context.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
于 2012-10-07T13:15:36.997 回答