0

C++ _popen パイプ マジックを使用して、シェルで「nslookup [IP]」コマンドを発行して取得した応答を循環しています。

ご存じのとおり (ターミナルから試してみてください... Windows コマンド プロンプトは別の OS とは異なる出力をする場合があります。私は Windows 7 を使用しています)、nslookup クエリは次のような結果を返します。

C:\MyApps>nslookup 8.8.8.8
Server:  dns.mydomain.com
Address:  192.168.200.15

Name:    google-public-dns-a.google.com
Address:  8.8.8.8

これが私のコードです(重要なスニペット):

vector<string> IPAddresses;
// [...] some code to populate IP Addresses into that vector [...]

char buff[512];
for(int x=0;x<IPAddresses.size();x++)
{
    cmd = "nslookup " + IPAddresses[x];
    FILE *fpipe = _popen(cmd.c_str(),"r");
    while(fgets(buff, sizeof(buff), fpipe)!=NULL)
    {
        //DEBUG CODE HERE
    }
}

次に、「デバッグ コード」の例とその出力を確認します (DNS レコードが存在しない場合、「IP が見つかりません: 存在しないドメイン」エラーは正常であることに注意してください)。

if(buff[0]=='N') cout<<buff;

出力:

Name:   computer1.mydomain.com
Name:   computer2.mydomain.com
*** dns.mydomain.com can't find 192.168.200.55: Non-existent domain
Name:   computer3.mydomain.com
*** dns.mydomain.com can't find 192.168.200.122: Non-existent domain

デバッグ コード 2:

if(buff[0]=='*') cout<<buff;

出力:

*** dns.mydomain.com can't find 192.168.200.55: Non-existent domain
*** dns.mydomain.com can't find 192.168.200.122: Non-existent domain

buff[0] が 'N' になるように探しているときに、存在しないドメイン エラーがポップアップ表示されるのはなぜですか? 実際、両方のデバッグ例に表示されているため、私のプログラムは char が 'N' と '*' の両方であると認識していますか???

4

1 に答える 1

3

これらの 2 つの文字列が出力されているのは、コードが出力しているからではなく、プログラムがキャプチャしない (出力と混合されている) にnslookupそれらを書き込んでいるためです。stderr

于 2013-07-24T15:42:03.393 に答える