从iphdr传递数据到结构

时间:2017-06-15 07:49:27

标签: c arrays linux sockets struct

我在C编程方面不是很有经验,但我尝试使用C捕获和分析数据包数据,但我遇到的问题是我无法将数据传递给结构中的变量。有我的结构:

struct ipOut {
    unsigned int ipVer;
    unsigned int headerDWORDS;
    unsigned int headerBytes;
    unsigned int typeOfService;
    unsigned int ipLength;
    unsigned int ident;
    unsigned int ttl;
    unsigned int protocolNum;
    unsigned int checkSum;
   };
struct ipAddr{
    char srcIP[16];
    char destIP[16];
};
struct hexOut{
    unsigned char * hexBuff;
};
struct sockaddr_in src, dest;

我从套接字获得工作数据并将缓冲区发送到iphdr:

void ipHeaderOutput(unsigned char * buff, int data) {
    packetNum++;
    struct iphdr *iph = (struct iphdr*)buff;
    memset(&src, 0, sizeof(src));
    memset(&dest, 0, sizeof(dest));
    src.sin_addr.s_addr = iph->saddr;
    dest.sin_addr.s_addr = iph->daddr;

    struct ipOut ipHeader[packetNum];
    ipHeader[packetNum].ipVer = iph->version;
    ipHeader[packetNum].headerDWORDS = (unsigned int)iph->ihl;
    ipHeader[packetNum].headerBytes = (unsigned int)iph->ihl*4;
    ipHeader[packetNum].typeOfService = (unsigned int)iph->tos;
    ipHeader[packetNum].ipLength = ntohs(iph->tot_len);
    ipHeader[packetNum].ident =  ntohs(iph->id);
    ipHeader[packetNum].ttl = (unsigned int)iph->ttl;
    ipHeader[packetNum].protocolNum = (unsigned int)iph->protocol;
    ipHeader[packetNum].checkSum = ntohs(iph->check);

    struct ipAddr ipAddr[packetNum];
    strcpy(ipAddr[packetNum].srcIP, inet_ntoa(src.sin_addr));
    strcpy(ipAddr[packetNum].destIP, inet_ntoa(dest.sin_addr));
}

ipAddr结构完美地获取数据,没有任何问题。但是,数据根本没有传递给ipOut结构。在将数据从缓冲区传递到hexOut结构时,我遇到同样的问题:

void hexDataOut(unsigned char * buff, int data){
    hexNum++;

    struct hexOut h[hexNum];
    h[hexNum].hexBuff = (unsigned char *)malloc(65536);
    memcpy(h[hexNum].hexBuff, buff, 65536);
    h[hexNum].hexBuff = buff;
}

这也是创建动态struct标签的正确方法吗?

1 个答案:

答案 0 :(得分:2)

让我们仔细看看这两行:

struct ipOut ipHeader[packetNum];
ipHeader[packetNum].ipVer = iph->version;

第一个定义本地变量ipHeader,它是packetNum元素的数组。

第二行使用越界索引packetNum来访问数组中的元素。

首先,为什么要将ipHeader声明为数组?其次,为什么要将它定义为 local 变量?第三,超出范围会导致未定义的行为,这会使整个程序格式错误并且无效。

稍后使用ipAddr变量。