2008-09-10 4 views

Répondre

4

Je pense que le moyen le plus simple est une connexion socket à un serveur whois sur le port 43. Envoyez le nom de domaine suivi d'un retour à la ligne et lisez la réponse.

+0

Vous devez déterminer * quel * serveur whois utiliser en premier. Il y a un exemple de ceci ici: voici un bon exemple: http://flipbit.co.uk/2009/06/querying-whois-server-data-with-c.html –

+0

'Toutes les demandes sont terminées avec ASCII CR puis ASCII LF. ' https://tools.ietf.org/html/rfc3912 2. Spécification du protocole – brewmanz

-3

est ici la solution Java, qui ouvre juste une coquille et court whois:

import java.io.*; 
import java.util.*; 

public class ExecTest2 { 
    public static void main(String[] args) throws IOException { 
     Process result = Runtime.getRuntime().exec("whois stackoverflow.com"); 

     BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream())); 
     StringBuffer outputSB = new StringBuffer(40000); 
     String s = null; 

     while ((s = output.readLine()) != null) { 
      outputSB.append(s + "\n"); 
      System.out.println(s); 
     } 

     String whoisStr = output.toString(); 
    } 
} 
+0

Ne pas débourser juste pour exécuter une commande whois cela créera un flot ininterrompu de problèmes de sécurité et de performance.Utilisez plutôt les bibliothèques dans votre langage de programmation pour faire des requêtes whois ou puisque le protocole est si simple, ouvrez simplement un socket TCP sur le port 43 et envoyez votre requête. Lire RFC3912 pour plus de détails. –

2

réponse Thomas ne fonctionnera que si vous savez qui serveur « whois » pour se connecter.

Il existe de nombreuses façons de trouver cela, mais aucune (AFAIK) qui fonctionne de manière uniforme pour chaque registre de domaine.

Certains noms de domaine soutiennent un SRV record pour le service _nicname._tcp dans le DNS, mais il y a des problèmes avec cela parce qu'il n'y a pas de norme acceptée encore sur la façon d'éviter un sous-domaine de servir des SRV dossiers qui ont préséance sur ceux du registre officiel (voir http://tools.ietf.org/html/draft-sanz-whois-srv-00).

Pour de nombreux TLD, il est possible d'envoyer votre requête à <tld>.whois-servers.net. Cela fonctionne plutôt bien, mais attention, cela ne fonctionnera pas dans tous les cas où il y a des domaines de deuxième niveau officiellement délégués. Par exemple, en .uk, il existe plusieurs sous-domaines officiels, mais seulement certains d'entre eux sont exécutés par le registre .uk et les autres ont leurs propres services WHOIS et ceux-ci ne figurent pas dans la base de données whois-servers.net.

Embrouillant il y a aussi des registres « non officiels », comme .uk.com, qui sont dans la base de données whois-servers.net.

p.s. le délimiteur officiel End-Of-Line dans le WHOIS, comme avec la plupart des protocoles IETF est CRLF, pas seulement LF.

2

J'ai trouvé quelques services Web qui offrent cette information. Celui-ci est gratuit et a bien fonctionné pour moi. http://www.webservicex.net/whois.asmx?op=GetWhoIS

+0

A semblé prometteur mais j'obtiens: System.Net.Sockets.SocketException: Le nom demandé est valide, mais aucune donnée du type demandé n'a été trouvée à whois.whois.GetWhoIS (String HostName) (même en entrant une adresse IP dans le champ sur la page d'information elle-même) – Jimmy

4

J'ai trouvé un parfait exemple C# here.

Il est 11 lignes de code pour copier et coller directement dans votre propre application.

/// <summary> 
/// Gets the whois information. 
/// </summary> 
/// <param name="whoisServer">The whois server.</param> 
/// <param name="url">The URL.</param> 
/// <returns></returns> 
private string GetWhoisInformation(string whoisServer, string url) 
{ 
    StringBuilder stringBuilderResult = new StringBuilder(); 
    TcpClient tcpClinetWhois = new TcpClient(whoisServer, 43); 
    NetworkStream networkStreamWhois = tcpClinetWhois.GetStream(); 
    BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois); 
    StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois); 

    streamWriter.WriteLine(url); 
    streamWriter.Flush(); 

    StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois); 

    while (!streamReaderReceive.EndOfStream) 
     stringBuilderResult.AppendLine(streamReaderReceive.ReadLine()); 

    return stringBuilderResult.ToString(); 
} 
+1

Ajout, que je devais ajouter 'using System.Net.Sockets; using System.IO; 'pour compléter le code ... – KingsInnerSoul

2

J'ai trouvé un exemple parfait de C# ici. Il s'agit de 11 lignes de code à copier et coller directement dans votre propre application. MAIS D'ABORD, vous devez ajouter des instructions using pour vous assurer que les méthodes disposent sont correctement appelées pour éviter les fuites de mémoire:

StringBuilder stringBuilderResult = new StringBuilder(); 
using(TcpClient tcpClinetWhois = new TcpClient(whoIsServer, 43)) 
{ 
    using(NetworkStream networkStreamWhois = tcpClinetWhois.GetStream()) 
    { 
     using(BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois)) 
     { 
     using(StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois)) 
     { 
      streamWriter.WriteLine(url); 
      streamWriter.Flush(); 
      using (StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois)) 
      { 
       while (!streamReaderReceive.EndOfStream) stringBuilderResult.AppendLine(streamReaderReceive.ReadLine()); 
      } 
     } 
     } 
    } 
} 
+0

Merci d'avoir posté cette réponse. J'ai modifié votre message pour corriger certains problèmes de formatage du code. – Brian

+1

Avez-vous réellement exécuté le code? J'ai une exception "Impossible d'accéder à un flux fermé" lors de l'exécution de ce code. Si je n'ai pas mis une utilisation avant streamReader streamReaderReceive = new StreamReader (bufferedStreamWhois), je n'ai pas eu d'exception. –

Questions connexes