2010-08-12 98 views
1

我试图执行“whois search domainname.tld”。我目前正在使用系统(“whois search domainname.tld”);但是我需要获得输出到NSString变量输出给用户。目标C:终端输出到NSString中

我怎样才能做到这一点?

+0

不要使用系统和popen来做一个简单的whois请求。在你的编程语言或底部使用特定的库,只需在端口43上打开一个TCP套接字并发送由CR + LF终止的查询,如RFC3912 – 2018-01-04 20:13:34

回答

3

如果你愿意,你可以使用NSTask来完成相同的目标。现在,我通常不会为他们做人的功课,但这里是你如何用NSTask做这样的事情:pastie.org/1087887

这个想法是,您创建一个NSTask对象运行@"/usr/bin/whois"(磁盘上运行whois的位置)与参数@"search domainname.tld"。然后,您使用一个NSPipe对象来读取命令的输出,并将其返回给用户。

注:这个功能阻止(它会等到完成运行前whois结束),这是不推荐的,尤其是对网络运营。使这种异步是一个留给读者的练习。

2

改为使用popen

system函数调用不返回任何输出,所以你不能得到它。

可以使用popen到例如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; 
} 

看到man popen获取更多信息。

应该很容易将输出合并到Objective-C中,因为您可以从Objective-c调用C

+0

中所解释的那样非常有帮助,我假设这是因为这里没有Objective-c ...我只是展示了如何从C中获取输出,然后将它合并到Objective-c中,而不是调用system()。由于没有示例代码可以显示系统调用,所以我不打算编写整个应用程序,只是显示了重要的部分... – stefanB 2010-08-12 07:58:30

+0

+1如果OP使用system()并需要检索stdout,他应该知道popen()。 – mouviciel 2010-08-12 09:28:43