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的輸出比較,他們也沒有出現在那裏。
哇,我傻。原來,這正是問題所在。謝謝! – worr
雖然這適用於兩臺補充機器,但正確和便攜的方式是'*(無符號字符*)(buf + i)',即在* dereferencing之前強制指針類型*,而不是用錯誤類型解除引用(signed 'char'),然後將其轉換爲正確的類型。 –