2010-08-12 12 views
1

J'essaie d'exécuter "whois search domainname.tld". J'utilise actuellement system ("whois search domainname.tld"); Cependant, j'ai besoin d'obtenir la sortie dans une variable NSString pour la sortie à l'utilisateur.Objectif C: Sortie du terminal dans NSString

Comment puis-je faire cela?

+0

N'utilisez pas system ni popen pour effectuer une requête whois simple. Utilisez des librairies spécifiques dans votre langage de programmation ou en bas, ouvrez une socket TCP sur le port 43 et envoyez votre requête terminée par CR + LF comme expliqué dans RFC3912 –

Répondre

3

Si vous le souhaitez, vous pouvez également utiliser NSTask pour atteindre le même objectif. Maintenant, je ne suis généralement pas un pour faire les devoirs des gens pour eux, mais voici comment vous pourriez faire quelque chose comme ça avec NSTask: pastie.org/1087887.

L'idée est que vous créez un objet NSTask pour exécuter @"/usr/bin/whois" (l'emplacement sur le disque où whois est exécuté à partir) avec l'argument @"search domainname.tld". Vous utilisez ensuite un objet NSPipe pour lire la sortie de la commande et la renvoyer à l'utilisateur. Cette fonction est bloquante (il faudra patienter jusqu'à ce que whois finisse de s'exécuter avant la fin), ce qui est déconseillé, en particulier pour les opérations réseau. Rendre ceci asynchrone est un exercice laissé au lecteur.

2

Utilisez à la place popen.

L'appel de fonction system ne renvoie aucune sortie de sorte que vous ne pouvez pas l'obtenir avec cela.

Vous pouvez utiliser popen par exemple à la sortie du tuyau de netstat -l:

#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main() 
{ 
    FILE * fp; 
    int status; 
    const unsigned int sz = 1024; 
    char buf[sz]; 

    string cmd; 
    //cmd = "ls *"; 
    cmd = "netstat -l"; 
    fp = popen(cmd.c_str(), "r"); 
    if (fp == NULL) return 0; 

    while (fgets(buf, sz, fp) != NULL) 
     printf("%s", buf); 

    status = pclose(fp); 
    if (status == -1) 
    { 
     cout << "pclose failed" << endl; 
    } 

    return 1; 
} 

voir man popen pour plus d'informations.

Il devrait être facile d'incorporer la sortie dans Objective-C puisque vous pouvez appeler C de Objective-c.

+0

downvote très utile, je suppose que c'est parce qu'il n'y a pas d'objectif-c impliqué ici ... Je montre juste comment obtenir la sortie de C qui peut être ensuite incorporée dans Objective-c au lieu de l'appel 'system()'. Comme il n'y a pas d'exemple de code en question montrant l'appel au système, je ne vais pas écrire toute l'application, montrant simplement la partie importante ... – stefanB

+0

+1 Si OP utilise system() et doit récupérer stdout, il devrait être conscient de popen(). – mouviciel