Здравствуйте. Кто-нибудь сталкивался с такой проблемой:
Создается сокет: 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).
>Здравствуйте. Кто-нибудь сталкивался с такой проблемой:
>Создается сокет: 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 .
Может ли такое быть, что моя версия BSD не поддерживает запись IP заголовка?
Если да, то как это проверить?
И еще: Самое странное, что setsockopt(rs,IPPROTO_IP,IP_HDRINCL,&op,sizeof(op))
нормально исполняется - никаких ошибок!
Ошибка возникает при следующем вызове sendto, а если не вызывать setsockopt, то sendto нормально работает с теми же аргументами!
Бред какой-то!
>Сходу не скажу, но попробуй заглянуть в исходники ping : /usr/src/sbin/ping/ping.c .
>
Посмотрел. Не используется IP_HDRINCL в ping. Все выставляется через опции.
>
>>Сходу не скажу, но попробуй заглянуть в исходники ping : /usr/src/sbin/ping/ping.c .
>>
>Посмотрел. Не используется IP_HDRINCL в ping. Все выставляется через опции.
http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/sbin/pi...
>>
>>>Сходу не скажу, но попробуй заглянуть в исходники ping : /usr/src/sbin/ping/ping.c .
>>>
>>Посмотрел. Не используется IP_HDRINCL в ping. Все выставляется через опции.
>
>
>http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/sbin/pi...Спасибо! Здесь действительно есть.
НО: В моем pinge - нет!!! Что это значит? Я что-то не понимаю. Автор ping'ов один.
Попробую этот исходник откомпилировать - будет ли работать...