LINUX.ORG.RU

IP RAW socket how using


0

0

Добрый день. Вот пишу прогу чтобы между двумя сетями работал широковещательный трафик в одной сети через libpcap слушаю потом в udp перегоняю другой проге в другой сети.... Короче та часть которая принимает должна пакет принятый на том конце (включая IP заголовок) выплюнуть в сеть назначения. так вот делаю.

fd=socket(AF_INET,SOCK_RAW,IPPROTO_UDP);

int rc=1; setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&rc,sizeof(rc));

по приему пакета все его содержимое отправляю через sendto

rc=recv(..... принимаю udp

struct sockaddr_in out; out.sin_addr.s_addr=inet_addr("192.168.1.255"); out.sin_port=0; out.sin_family=AF_INET; sendto(fd,mybuff,rc,0,(struct sockaddr *)&out,sizeof(out));

sendto возвращает -1 и perror пишет Permission denided...

Что делать?

anonymous

Добрый день.
Вот пишу прогу чтобы между двумя сетями работал широковещательный трафик
в одной сети через libpcap слушаю потом в udp перегоняю другой проге в другой сети....
Короче та часть которая принимает должна пакет принятый на том конце (включая IP заголовок) выплюнуть в сеть назначения.
так вот делаю.

fd=socket(AF_INET,SOCK_RAW,IPPROTO_UDP);

int rc=1;
setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&rc,sizeof(rc));

по приему пакета все его содержимое отправляю через sendto

rc=recv(..... принимаю udp

struct sockaddr_in out;
out.sin_addr.s_addr=inet_addr("192.168.1.255");
out.sin_port=0;
out.sin_family=AF_INET;
sendto(fd,mybuff,rc,0,(struct sockaddr *)&out,sizeof(out));

sendto возвращает -1 и perror пишет Permission denided...

Что делать?

Само собой делаю все под рутом

anonymous
()
Ответ на: комментарий от anonymous

ладно здесь зарабтадл

inet_addr("192.168.1.255") заменил на INADDR_ANY

но теперь пакеты записанные через sendto появляються на интерфейсе lo как их выкинуть в физическую сетку?

И почему попытка привязать сокет отправки к интерфейсу не работает setsockopt(fd,SOL_SOCKET,SO_BINDTODEVICE,"eth1",strlen("eth1" ;)); No such device...

anonymous
()
Ответ на: комментарий от cvv

Ачто с ним широковещательные рассылки будут работать ? 192.168.1.255 и 255.255.255.255

И почему это я криво пишу я то кода как такового и не показывал..

anonymous
()
Ответ на: комментарий от anonymous

>Ачто с ним широковещательные рассылки будут работать ? 192.168.1.255 и 255.255.255.255

должны, точнее в зависимости от используемого тоннеля.

некоторые тоннели позволяют поверх IP маршрутизировать ethernet. но эт просто к слову, на всякий случай.

если у тебя между сетями подсетями стоит только 1 маршрутизатор то скорее всего тебе будет достаточно открыть маршрутизацию броадкаста на нём. большинство должны позволять нормально маршрутизировать 192.168.1.255 а с 255.255.255.255 возможно могут быть проблемы.

>И почему это я криво пишу я то кода как такового и не показывал.

шото мне фрагменты/архитектура не по душе.

cvv ★★★★★
()
Ответ на: комментарий от mumg

тебе низачто не покажу. ;-)

а ещё между "кривой" и "не по душе" довольно большая разница

а ещё нечего себя обобщать до всех: за всё время мого пребывания на лоре я так ещё отрывался только на одного анонимуса и Pi. ну ещё шаман под гарячую руку попал.

по отношению к остальным у меня небыло причины оспаривать их профессиональную самооценку

cvv ★★★★★
()
Ответ на: комментарий от cvv

ну тогда не зачем флейм разводить,
только запомните одно cvv, мы с вами свиней не пасли чтобы тыкать.
о вас свое мнение я уже сложил, боюсь что у остальных со мной мнение совпадает.
кстати большой гонор не показатель большого ума, к сожалению наверное, иначе было бы куча крутых программистов.

mumg
()
Ответ на: комментарий от mumg

>мы с вами свиней не пасли чтобы тыкать.

Ок, извините.

>кстати большой гонор не показатель большого ума, к сожалению наверное, иначе было бы куча крутых программистов.

никто не спорит.

PS:не думайте что моё мнение о Вас отличается от Вашего обо мне.

cvv ★★★★★
()
Ответ на: комментарий от anonymous

ответы посуществу:

замени

>int rc=1;
>setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&rc,sizeof(rc)); 

на

int rc=1;
setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&rc,sizeof(rc)); 
rc=1;
setsockopt(fd,SOL_SOCKET, SO_BROADCAST,&rc,sizeof(rc));

cvv ★★★★★
()
Ответ на: комментарий от anonymous

>inet_addr("192.168.1.255") заменил на INADDR_ANY

>но теперь пакеты записанные через sendto появляються на интерфейсе lo как их выкинуть в физическую сетку?

только они теперь не броадкастовые и следственно никому ненужны

cvv ★★★★★
()
Ответ на: комментарий от anonymous

> out.sin_addr.s_addr=inet_addr("192.168.1.255");

а это не broadcast ли?

> sendto возвращает -1 и perror пишет Permission denided...

попробуйте setsockopt(SO_BROADCAST)

idle ★★★★★
()
Ответ на: комментарий от anonymous

>И почему попытка привязать сокет отправки к интерфейсу не работает setsockopt(fd,SOL_SOCKET,SO_BINDTODEVICE,"eth1",strlen("eth1" ; ;)); No such device...

а может надо было попробовать bind()?

cvv ★★★★★
()
Ответ на: комментарий от cvv

>>inet_addr("192.168.1.255") заменил на INADDR_ANY

>>но теперь пакеты записанные через sendto появляються на интерфейсе lo как их выкинуть в физическую сетку?

>только они теперь не броадкастовые и следственно никому ненужны

извиняюсь. не совсем корректно.

если точнее: поведение системы в таком случае полохопредсказуемо и вероятней всего пакет уйдёт из первого интерфейса в ядрёном списке интерфейсов. хотя может быть абсолюно всё включая переписывание ядром IP-заголовка

cvv ★★★★★
()
Ответ на: комментарий от anonymous

это выглядит немного странно:

> socket(AF_INET,SOCK_RAW,IPPROTO_UDP);
> setsockopt(fd,IPPROTO_IP,IP_HDRINCL,&rc,sizeof(rc));

почему не просто
     socket(AF_INET,SOCK_RAW, IPPROTO_RAW);

? подразумевает hdrincl.

хотя я в этом плохо разбираюсь.

idle ★★★★★
()
Ответ на: комментарий от idle

Ок попробую наконецто дошел до работы там у меня Стивенсон лежал зачитал седня буду разбираться. Задолбали меня уже проблемы с дешевым железом :-]]]

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.