2013-07-24 1 views
0

C 쉘 _popen 파이프 마술을 사용하여 쉘에서 "nslookup [IP]"명령을 실행하는 응답을 반복합니다. 아시다시피내 논리가 실패했습니다 (C++, nslookup, char 비교)

은 (터미널에서 그것을 시도 ... 윈도우는 다른 OS 다르게하라는 메시지가 표시 될 수 있습니다 출력을 명령, 나는 윈도우 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 

을 어떤 DNS 레코드 존재가 없을 때 오류가 정상입니다 :

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 
    } 
} 

이제 내 "DEBUG 코드"예하고 "비 존재하지 않는 도메인 IP를 찾을 수 없습니다"는 것을주의 자신의 출력을 (확인 : 여기에 내 코드 (중요한 조각은)입니다) :

,451,515,
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 

존재하지 않는 도메인 오류가 내가 찾고있을 때 팝업 수있는 방법 버프 [0]은 'N'이 될까요? 사실, 그것은 두 디버그 예제에서 나타나기 때문에 내 프로그램은 char이 'N'과 '*'라고 생각합니까 ???

+0

'popen'에서'stdout' 결과물을 얻었지만'stderr'에 대한 오류/진단 메시지는 여전히 콘솔에 직접 전달됩니다. –

+0

그런 경우 전체 DNS 조회 오류가 출력됩니다. 맞습니까? 존재하지 않는 도메인 오류의 세 번째 줄뿐만 아니라? – armani

+1

잘 모르겠다 - Windows이므로 아무 것도 확실하지 않지만 가장 좋은 추측은 stdout/stderr 일이라는 것입니다. 명령 줄에서 이론을 테스트 할 수 있습니다. –

답변

3

이 두 문자열은 코드가 인쇄하고 있기 때문에가 아니라 nslookup이 프로그램에서 캡처하지 않고 출력과 섞여서 stderr에 쓰고 있기 때문에 출력되는 것일 수 있습니다.

+0

나는 디버그 코드를 모두 제거하여 이론을 테스트했다. 나는 아직도 그 메시지를 가지고있다! stderr이어야합니다 – armani

+0

기존 코드 스 니펫을 사용하여 stderr를 캡처하는 방법에 대한 팁은 무엇입니까? – armani

+0

명령에 "2> & 1"을 추가하면'stderr'가'stdout'으로 재 지정됩니다. –