Ошибка при создании заголовка ip для настроенного пакета - PullRequest
0 голосов
/ 03 ноября 2010

Я прохожу кусок кода для инжектора пакетов.Когда я пытался скомпилировать его, он показывает ошибку:

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 Ответ

2 голосов
/ 03 ноября 2010

Результатом приведения является значение r, поэтому вы не можете назначить его.В такой ситуации обычно требуется выполнить что-то вроде:

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

Т.е. взять адрес, привести его к указателю на правильный тип и разыменовать этот указатель.Просто убедитесь, что определенный тип членов saddr и daddr - это то, что может действительно содержать адрес.Обычно так и должно быть, но двойная проверка не помешает.

...