Необработанные сокеты: как определить флаги TCP (учитывая порядок байтов) и когда использовать функцию hton? - PullRequest
0 голосов
/ 05 апреля 2011

Я прочитал учебное пособие (http://mixter.void.ru/rawip.html) о том, как создавать свои собственные заголовки IP и TCP и отправлять их, используя необработанные сокеты. У меня есть два сомнения, которые связаны с порядком байтов ОС. Я использую Linux наIntel x86.

Во-первых, как определить флаги TCP?

#define TCP_URG 1
#define TCP_ACK 2
#define TCP_PSH 4
#define TCP_RST 8
#define TCP_SYN 16
#define TCP_FIN 32

Или

#define TCP_URG 32
#define TCP_ACK 16
#define TCP_PSH 8
#define TCP_RST 4
#define TCP_SYN 2
#define TCP_FIN 1

Еще одно сомнение из того же руководства заключается в том, что при создании ip и tcpзаголовок, некоторые поля преобразуются в сетевой порядок байтов, а затем сохраняются в заголовке, в то время как другие сохраняются в том виде, как они есть, например

iph->ip_ttl = 255;

и

 iph->ip_id = htonl (54321);

Почему это так?

Отредактировано: Когда я пытаюсь запустить эту программу подмены ip на моей машине, sendto возвращается с ошибкой «Отказано в доступе» (хотя я запускаю его как суперпользователь). Почему это происходит?и как это исправить?

1 Ответ

0 голосов
/ 05 апреля 2011

Поле ip_ttl содержит только один байт, поэтому порядок следования байтов не имеет значения. С другой стороны, ip_id равен 16 битам, поэтому здесь порядок байтов имеет значение.

Поскольку значение, присвоенное ip_ttl, будет усечено до первого байта, вы не должны использовать htons / htonl, поскольку макросы неявно переводят ваше целое число в больший тип и байт, который вы Заинтересованы могут быть усечены.

Ваш первый набор флагов правильный.

...