我正在使用libpcap(gcc,linux),由于某种原因,我想从u_char packet[]
提取数据包长度,将其保存为整数;说存储在packet[38] packet[39]
中的数据包长度。就像是:
#include <stdio.h>
#include <netdb.h>
int main(int argc, char *argv[]) {
u_char packet[2] = {0xaa, 0xfc};
int length = 0xaafc; // how to do that ?
printf("%d\n", length);
}
到目前为止,我已经尝试过了:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
int main(void)
{
u_char packet[2] = {0xaa, 0xfc};
int l = packet[0] | (packet[1]<<8);
printf("%d\n", l);
}
但是没有成功!
那么如何在c中完成此操作?如果我应该在这里发布整个代码,也可以命名...
谢谢。
最佳答案
尽管可以按照自己的方式进行操作,但将指向缓冲区的指针强制转换为正确的类型要容易得多:
#include <linux/ip.h>
int main(void)
{
u_char *packet = ...;
int total_len;
int ip_hdr_len;
struct iphdr* iph;
struct tcphdr* tcph;
iph = (void*)packet;
// Remember fields are in network order!
// convert them to host order with ntoh[sl]
total_len = ntohs(iph->tot_len);
ip_hdr_len = iph->ihl * 4;
// Assuming TCP...
// Also be sure to check that packet is long enough!
tcph = (void*)(packet + ip_hdr_len);
}
关于c - 从libpcap捕获中提取数据包长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23769700/