URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5272
[ Назад ]

Исходное сообщение
"ошибка RAWсокет + HDRINCL в BSD"

Отправлено alx , 26-Мрт-06 16:19 
Здравствуйте. Кто-нибудь сталкивался с такой проблемой:
Создается сокет: rs=socket(PF_INET,SOCK_RAW,0)
В него высылаются данные: i=sendto(rs,ptr,iphlen,0,(struct sockaddr *)&dest,destlen)
ВСЕ РАБОТАЕТ! И, естественно, добавляется IP header.
Нужно создать свой IP header,
НО, как только выставляется опция: setsockopt(rs,IPPROTO_IP,IP_HDRINCL,&op,sizeof(op))
ТО вызов sendto возвращает ошибку Invalid argument.
Я убил на это уже три дня! Ничего не помогает. Мой IP header:
  bzero(&iph,iphlen);
    iph.v_hl = 0x45;
    iph.tos  = 0x00;
    iph.tlen = htons(0x0014);        
    iph.trid = htons(0x0000);        
    iph.offs = htons(0x0000);        
    iph.ttl  = 0x40;
    iph.prot = 0x00;
    iph.csum = htons(0x0000);    /* пытался выставлять! */        
    iph.sadr = htonl(src_addr);  /* равен IP системы */        
    iph.dadr = htonl(dst_addr);     /* равен указанному в (struct sockaddr *)&dest    */

Система freeBsd 4.11
Права root (uid=0).


Содержание

Сообщения в этом обсуждении
"ошибка RAWсокет + HDRINCL в BSD"
Отправлено chip , 26-Мрт-06 17:20 
>Здравствуйте. Кто-нибудь сталкивался с такой проблемой:
>Создается сокет: rs=socket(PF_INET,SOCK_RAW,0)
>В него высылаются данные: i=sendto(rs,ptr,iphlen,0,(struct sockaddr *)&dest,destlen)
>ВСЕ РАБОТАЕТ! И, естественно, добавляется IP header.
>Нужно создать свой IP header,
>НО, как только выставляется опция: setsockopt(rs,IPPROTO_IP,IP_HDRINCL,&op,sizeof(op))
>ТО вызов sendto возвращает ошибку Invalid argument.
>Я убил на это уже три дня! Ничего не помогает. Мой IP
>header:
>  bzero(&iph,iphlen);
>    iph.v_hl = 0x45;
>    iph.tos  = 0x00;
>    iph.tlen = htons(0x0014);
>    iph.trid = htons(0x0000);
>    iph.offs = htons(0x0000);
>    iph.ttl  = 0x40;
>    iph.prot = 0x00;
>    iph.csum = htons(0x0000);    /* пытался
>выставлять! */
>    iph.sadr = htonl(src_addr);  /* равен IP системы
>*/
>    iph.dadr = htonl(dst_addr);  /* равен указанному в
>(struct sockaddr *)&dest */
>
>Система freeBsd 4.11
>Права root (uid=0).

Сходу не скажу, но попробуй заглянуть в исходники ping : /usr/src/sbin/ping/ping.c .


"ошибка RAWсокет + HDRINCL в BSD"
Отправлено alx , 26-Мрт-06 17:50 
Может ли такое быть, что моя версия BSD не поддерживает запись IP заголовка?
Если да, то как это проверить?
И еще: Самое странное, что setsockopt(rs,IPPROTO_IP,IP_HDRINCL,&op,sizeof(op))
нормально исполняется - никаких ошибок!
Ошибка возникает при следующем вызове sendto, а если не вызывать setsockopt, то sendto нормально работает с теми же аргументами!
Бред какой-то!

"ошибка RAWсокет + HDRINCL в BSD"
Отправлено alx , 26-Мрт-06 18:20 

>Сходу не скажу, но попробуй заглянуть в исходники ping : /usr/src/sbin/ping/ping.c .
>
Посмотрел. Не используется IP_HDRINCL в ping. Все выставляется через опции.


"ошибка RAWсокет + HDRINCL в BSD"
Отправлено chip , 26-Мрт-06 18:39 
>
>>Сходу не скажу, но попробуй заглянуть в исходники ping : /usr/src/sbin/ping/ping.c .
>>
>Посмотрел. Не используется IP_HDRINCL в ping. Все выставляется через опции.


http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/sbin/pi...


"ошибка RAWсокет + HDRINCL в BSD"
Отправлено alx , 26-Мрт-06 22:15 
>>
>>>Сходу не скажу, но попробуй заглянуть в исходники ping : /usr/src/sbin/ping/ping.c .
>>>
>>Посмотрел. Не используется IP_HDRINCL в ping. Все выставляется через опции.
>
>
>http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/sbin/pi...

Спасибо! Здесь действительно есть.
НО: В моем pinge - нет!!! Что это значит? Я что-то не понимаю. Автор ping'ов один.
Попробую этот исходник откомпилировать - будет ли работать...