2011-08-08 41 views
1

我遇到以下代碼的問題。我收到我的數據沒有問題,但是這些數據是無關位加載的!例如,下面的代碼從nfqueue獲取指向它的所有流量,並打印出每個字節後跟一個換行符。爲什麼我在使用libnfqueue的recv()調用中獲得額外的位?

首先,數據正是我所期望的,但是接下來有些行看起來有4個字節!

int main(int argc, char** argv) { 
    int fd; 
    ssize_t rv; 
    char buf[4096]; 
    struct nfq_handle* h; 
    struct nfq_q_handle* qh; 

    h = nfq_open(); 
    if (!h) { 
     fprintf(stderr, "error during nfq_open()\n"); 
     exit(1); 
    } 

    if (nfq_unbind_pf(h, AF_INET) < 0) { 
     fprintf(stderr, "error during nfq_unbind_pf()\n"); 
     exit(1); 
    } 

    if (nfq_bind_pf(h, AF_INET) < 0) { 
     fprintf(stderr, "error during nfq_bind_pf()\n"); 
     exit(1); 
    } 

    printf("Binding to queue 0...\n"); 
    qh = nfq_create_queue(h, 0, &cb, NULL); 
    if (!qh) { 
     fprintf(stderr, "error during nfq_create_queue()\n"); 
     exit(1); 
    } 

    printf("Copying packets...\n"); 
    if (nfq_set_mode(qh, NFQNL_COPY_PACKET, 0xffff) < 0) { 
     fprintf(stderr, "error during nfq_set_mode()\n"); 
     exit(1); 
    } 

    fd = nfq_fd(h); 

    memset(buf, 0, 4096); 
    while ((rv = recv(fd, buf, sizeof(buf), 0)) && rv >= 0) { 
    for (int i = 0; i < rv; i++) printf("%02x\n", *(buf+i)); 
    printf("\n\n"); 
     nfq_handle_packet(h, buf, rv); 
    } 

    nfq_destroy_queue(qh); 
    nfq_close(h); 
} 

輸出:

... 
50 
10 
39 
08 
48 
ffffffa4 
00 
00 
... 

我不能在互聯網上找到類似這樣的問題,任何東西,或bug跟蹤。我可以從哪裏開始診斷?爲什麼我的數據中有這些額外的位?我該如何解決它?

我做了一個tcpdump的輸出比較,他們也沒有出現在那裏。

回答

2

看來,緩衝區包含超過128的值的字符,併發生簽名/無符號轉換錯誤。

我已經計算出你的字節的值 - 這是164試圖將字節轉換成字符無符號將它們傳遞給printf前:

printf("%02x\n", *(unsigned char*)(buf+i)); 
+0

哇,我傻。原來,這正是問題所在。謝謝! – worr

+3

雖然這適用於兩臺補充機器,但正確和便攜的方式是'*(無符號字符*)(buf + i)',即在* dereferencing之前強制指針類型*,而不是用錯誤類型解除引用(signed 'char'),然後將其轉換爲正確的類型。 –

相關問題