为自定义数据包创建IP标头时出错

时间:2010-11-03 03:58:03

标签: c sockets packets

我正在查看数据包注入的一段代码。当我尝试编译它时,显示错误:

IP-Packet-Injection.c:155: error: lvalue required as left operand of assignment
IP-Packet-Injection.c:156: error: lvalue required as left operand of assignment

该特定部分的代码是:

unsigned char *CreateIPHeader(/* Customize this as an exercise */)
{
        struct iphdr *ip_header;

        ip_header = (struct iphdr *)malloc(sizeof(struct iphdr));

        ip_header->version = 4;
        ip_header->ihl = (sizeof(struct iphdr))/4 ;
        ip_header->tos = 0;
        ip_header->tot_len = htons(sizeof(struct iphdr));
        ip_header->id = htons(111);
        ip_header->frag_off = 0;
        ip_header->ttl = 111;
        ip_header->protocol = IPPROTO_TCP;
        ip_header->check = 0; /* We will calculate the checksum later */
      /*this is line 155 */ (in_addr_t)ip_header->saddr = inet_addr(SRC_IP);
      /*this is line 156 */ (in_addr_t)ip_header->daddr = inet_addr(DST_IP);


        /* Calculate the IP checksum now : 
           The IP Checksum is only over the IP header */

        ip_header->check = ComputeIpChecksum((unsigned char *)ip_header, ip_header->ihl*4);

        return ((unsigned char *)ip_header);

}

我在代码中显示了第155行和第156行。我在那里看不到任何问题。谁能告诉我错误是什么?提前致谢。 操作系统:Ubuntu,编译器:GCC。

1 个答案:

答案 0 :(得分:2)

演员表的结果是右值,所以你无法分配它。对于这种情况,您通常需要执行以下操作:

*(in_addr_t *)(&(ip_header->saddr)) = in_addr(SRC_IP);

即,取地址,将其转换为指向正确类型的指针,并取消引用该指针。只需确保saddrdaddr成员的定义类型是可以实际拥有该地址的内容。它通常应该是,但仔细检查也不会有什么坏处。