我在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标签的正确方法吗?
答案 0 :(得分:2)
让我们仔细看看这两行:
struct ipOut ipHeader[packetNum];
ipHeader[packetNum].ipVer = iph->version;
第一个定义本地变量ipHeader
,它是packetNum
元素的数组。
第二行使用越界索引packetNum
来访问数组中的元素。
首先,为什么要将ipHeader
声明为数组?其次,为什么要将它定义为 local 变量?第三,超出范围会导致未定义的行为,这会使整个程序格式错误并且无效。
稍后使用ipAddr
变量。