我正在使用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/

10-12 07:27