Изменить IP-заголовок из сокета UDP перед вызовом sendto()

#c #sockets

#c #сокеты

Вопрос:

Привет, в настоящее время я изучаю программирование сокетов на C , и в целях тестирования я хочу изменить зарезервированный бит в IP-заголовке UDP-пакета перед отправкой данных с сокетом.

Мой текущий код выглядит следующим образом:

 if((sock_udp = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    {
        perror("Socket error");
        return(-1);
    }

    strcpy(buffer, "Hello");
    int length = strlen(buffer)  1;

    destaddr.sin_family = AF_INET;
    inet_aton(ip, amp;destaddr.sin_addr);
    destaddr.sin_port = htons(port);

    // Can I somehow modify the IP header here?

    if(sendto(sock_udp, buffer, length, 0, (const struct sockaddr *)amp;destaddr, sizeof(destaddr)) >= 0){
       ...
    }
    ...
}
  

Ответ №1:

Во-первых, в соответствии с RFC 791 для флагов IPv4:

Бит 0: зарезервирован, должен быть равен нулю

Поэтому вам следует избегать его изменения.

Но если это действительно требуется вашему приложению, вы не можете использовать обычный SOCK_DGRAM , а вместо этого вам нужно использовать a SOCK_RAW , который позволяет создавать свой собственный полный пакет. Основным недостатком является то, что вам приходится заполнять заголовок Ethernet и вычислять контрольные суммы (для заголовка IP и UDP). Также для использования приложения SOCK_RAW требуются права суперпользователя или CAP_NET_RAW возможности.

Для получения дополнительной информации о SOCK_RAW нем вы можете заглянуть на справочную страницу packet . Онлайн-версия здесь.