#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
. Онлайн-версия здесь.