将结构转换为指针
Casting structs to the pointers
这几天我在c上处理数据包,我已经成功创建了icmp数据包来发送,但是我没有自己把它放入socket的方法,所以我找到了应该执行类似操作的多个代码。所以他们都包含我不完全理解的部分,我找不到任何关于它的信息。他们将带有数据包的结构转换为 char 指针,如下所示:
static char *packet;
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
当我尝试这个时,我遇到了分段错误。请向我解释转换结构的目的以及为什么同一段代码在我的情况下不起作用。谢谢。
已编辑
struct iphdr *ip;
struct icmphdr *icmp;
ip=malloc(sizeof(*ip));
icmp=malloc(sizeof(*icmp));
int sock;
uint16_t psize = sizeof(*icmp)+sizeof(*ip);
static char *packet;
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
unsigned int id = (unsigned int)rand();
unsigned int seq = (unsigned int)rand();
ip->version = 4;
ip->ihl = 5;
ip->tos = 0;
ip->tot_len = htons(psize);
ip->id = id;
ip->frag_off = 0;
ip->ttl = 255;
ip->protocol = IPPROTO_ICMP;
ip->saddr = subnet.ipDec;
icmp->type = 8;
icmp->code = 0;
icmp->un.echo.id=id;
icmp->un.echo.sequence=seq;
icmp->checksum=0;
sock=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
struct sockaddr_in destIP;
destIP.sin_family=AF_INET;
uint32_t destIPDec=0;
ip->daddr = destIPDec;
destIP.sin_addr.s_addr=destIPDec;
sendto(sock, packet, psize, 0, (struct sockaddr*) &destIP, sizeof(destIP));
您的代码中存在一个基本错误。
这里给两个变量分配内存
ip=malloc(sizeof(*ip));
icmp=malloc(sizeof(*icmp));
但在你这样做之后不久
static char *packet;
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
所以ip
和icmp
不再指向分配的内存。相反,您为它们分配了未初始化变量的值,即 packet
。这是未定义的行为并解释了段错误。
如果你想创建一个packet
,你必须一个分配内存块给它而不是'sub structues'。你有
ip=malloc(sizeof(*ip));
icmp=malloc(sizeof(*icmp));
int sock;
uint16_t psize = sizeof(*icmp)+sizeof(*ip);
static char *packet;
ip= (struct iphdr*) packet; // here you access undefined pointer packet; previous contents of ip is lost
icmp= (struct icmphdr*)(ip+1); // same for icmp
删除您拥有的 malloc()
s 并将其更改为
----
static char *packet;
packet = malloc( sizeof *ip + sizeof *icmp );
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
当您为 ip
和 icmp
赋值时会出现此问题。我推荐以下代码:
struct packet {
struct iphdr ip;
struct icmphdr icmp;
} myPacket;
myPacket = (struct packet*)malloc( sizeof(struct packet) );
ip =(struct iphdr*) &packet.ip;
icmp = (struct icmphdr*) &packet.icmp;
这几天我在c上处理数据包,我已经成功创建了icmp数据包来发送,但是我没有自己把它放入socket的方法,所以我找到了应该执行类似操作的多个代码。所以他们都包含我不完全理解的部分,我找不到任何关于它的信息。他们将带有数据包的结构转换为 char 指针,如下所示:
static char *packet;
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
当我尝试这个时,我遇到了分段错误。请向我解释转换结构的目的以及为什么同一段代码在我的情况下不起作用。谢谢。
已编辑
struct iphdr *ip;
struct icmphdr *icmp;
ip=malloc(sizeof(*ip));
icmp=malloc(sizeof(*icmp));
int sock;
uint16_t psize = sizeof(*icmp)+sizeof(*ip);
static char *packet;
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
unsigned int id = (unsigned int)rand();
unsigned int seq = (unsigned int)rand();
ip->version = 4;
ip->ihl = 5;
ip->tos = 0;
ip->tot_len = htons(psize);
ip->id = id;
ip->frag_off = 0;
ip->ttl = 255;
ip->protocol = IPPROTO_ICMP;
ip->saddr = subnet.ipDec;
icmp->type = 8;
icmp->code = 0;
icmp->un.echo.id=id;
icmp->un.echo.sequence=seq;
icmp->checksum=0;
sock=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
struct sockaddr_in destIP;
destIP.sin_family=AF_INET;
uint32_t destIPDec=0;
ip->daddr = destIPDec;
destIP.sin_addr.s_addr=destIPDec;
sendto(sock, packet, psize, 0, (struct sockaddr*) &destIP, sizeof(destIP));
您的代码中存在一个基本错误。
这里给两个变量分配内存
ip=malloc(sizeof(*ip));
icmp=malloc(sizeof(*icmp));
但在你这样做之后不久
static char *packet;
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
所以ip
和icmp
不再指向分配的内存。相反,您为它们分配了未初始化变量的值,即 packet
。这是未定义的行为并解释了段错误。
如果你想创建一个packet
,你必须一个分配内存块给它而不是'sub structues'。你有
ip=malloc(sizeof(*ip));
icmp=malloc(sizeof(*icmp));
int sock;
uint16_t psize = sizeof(*icmp)+sizeof(*ip);
static char *packet;
ip= (struct iphdr*) packet; // here you access undefined pointer packet; previous contents of ip is lost
icmp= (struct icmphdr*)(ip+1); // same for icmp
删除您拥有的 malloc()
s 并将其更改为
----
static char *packet;
packet = malloc( sizeof *ip + sizeof *icmp );
ip= (struct iphdr*) packet;
icmp= (struct icmphdr*)(ip+1);
当您为 ip
和 icmp
赋值时会出现此问题。我推荐以下代码:
struct packet {
struct iphdr ip;
struct icmphdr icmp;
} myPacket;
myPacket = (struct packet*)malloc( sizeof(struct packet) );
ip =(struct iphdr*) &packet.ip;
icmp = (struct icmphdr*) &packet.icmp;