2011-06-22 55 views
0

我試着運行這段代碼,但沒有任何顯示。 (是的,我把它作爲根運行)如果我不能得到ngrep的輸出我想我會試圖找出如何使用libpcap與c + +,雖然我一直沒能找到任何好的例子。我可以用popen()解析ngrep的輸出嗎?

int main(void) 
{ 
    FILE* fproc = popen("ngrep -d wlan0 GET"); 
    char c; 
    do { 
     printf("%c", fgetc(fproc)); 
    } while (c!=EOF); 
} 

那麼這段代碼是什麼原因導致什麼是表演,你有什麼建議可以輕鬆解析的ngrep的輸出,或捕獲GET請求的一些其他的方式,可能與libpcap的

回答

1

我看到可能的潛力問題:

  1. 您有沒有開放模式的popen調用?將它關閉可能會導致堆棧的核心轉儲或隨機值決定它是讀取還是寫入管道。

  2. c變量應該是一個int,而不是char,因爲它必須能夠容納所有字符加上一個EOF指標。

  3. 而且,你實際上並不是分配給c,這會導致循環退出。

  4. 對於那個do循環,您試圖在輸出流的末尾輸出EOF。如果這是一件壞事,不要知道我的頭腦,但肯定沒有必要。

試試這個:

int main(void) { 
    int ch; 
    FILE* fproc; 

    if ((fproc = popen("ngrep -d wlan0 GET", "r")) < 0) { 
     fprintf (stderr, "Cannot open pipe\n"); 
     return 1; 
    } 

    while ((ch = fgetc (fproc)) != EOF) { 
     printf ("%c", ch); 
    }; 

    pclose (fproc); 

    return 0; 
} 

你也應該知道,該管完全由默認的緩衝,所以你可能無法得到任何信息,直到緩衝區已滿。 「

+0

」您還應該意識到,管道默認情況下已完全緩衝,因此在緩衝區滿之前您可能無法獲得任何信息。「我怎樣才能得到每個字符,因爲它是由ngrep輸出的?瞬間,不必等待緩衝區已滿。 – vilive

相關問題