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

Исходное сообщение
"socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"

Отправлено YaS , 14-Мрт-02 02:29 
есть программа в ней открыт сокет AF_PACKET,SOCK_RAW,ETH_P_ALL
программа запущена и сокет читается с помощью recvfrom
и если сделать ping то прочитается только один пакет
а следующий нужно прочесть естественно сново вызывая recvfrom. Так читаются все пакеты для данного сокета. Но вот проблема, мне нужно после каждой recvfrom, из своей же программы отправлять пакеты еще кудато, не важно куда, НО все отправленные пакеты они тоже линухом заносятся в буффер для моего сокета(AF_PACKET,SOCK_RAW,ETH_P_ALL), и получается
вечный цикл так как буффер никода не опустошится так как как только один пакет принимается с revfrom то когда я куда то отправляю то сново пакеты из моей программы они линухм в буффер кидаются, а если на время отправки закрывать сокет то теряется все что там было для него в буффере. Так вопрос такой, можно ли как то заблокировать, на время какой-то операции, сокет(AF_PACKET,SOCK_RAW,ETH_P_ALL) ?
а потом сново разблокировать, что-то типа.

Содержание

Сообщения в этом обсуждении
"RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Отправлено uncle Bob , 20-Мрт-02 16:17 
А если создать два сокета, один для чтения, другой для записи?

"RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Отправлено YaS , 21-Мрт-02 04:47 
Так не выйдет, линух будет писать все пакеты в оба сокета.


"RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Отправлено uncle Bob , 21-Мрт-02 13:53 
>Так не выйдет, линух будет писать
>все пакеты в оба сокета.
>
Почему в оба сокета, если ты укажешь для каждого действия свой дескриптор? Например:
s1=socket(AF_INET,SOCK_RAW,...);
s2=socket(AF_INET,SOCK_RAW,...);
...
recvfrom(s1,..);
sendto(s2,..);

Linux будет писать все пакеты во все имеющиеся интерфейсы, а не в сокеты.


"RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Отправлено XMan , 21-Мрт-02 16:00 
Sorry, что втреваю в разговор :))
А это работает ? Проверено ? Ибо мне кажется, что товарищ отчасти прав, потому как слушает он именно интерфейсы (причем, все), а сокеты служат только для связи программы с более низкими уровнями. Как только в интерфейсе появляется любой пакет (входящий/исходящий), он тут же может быть получен программой, которая следит за состоянием интерфейса.

Я бы рекомендовал ставить метки в отправляемых пакетах и при приеме просто игнорировать их.


"RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Отправлено uncle Bob , 21-Мрт-02 20:14 
>
>А это работает ? Проверено ?

Обе функции (sendto, recvfrom) проверены поотдельности, все работает. Вместе в единый модуль пока еще не склеивал.

>Я бы рекомендовал ставить метки в
>отправляемых пакетах и при приеме
>просто игнорировать их.

Не совсем понятно. Сетевая карта не примет пакет, если он адресован не ей, т.е. если МАС-адрес не ее. Разве что она переведена в "прозрачный" режим, и забирает на себя весь траффик. Но тут неизвестны изначальные условия ее работы.


"RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Отправлено XMan , 21-Мрт-02 20:52 
Под меткой я подразумевал определенное значение определенных битов/байтов в области данных.

Кстати, в качестве подобной метки может служить обратный адрес - если он совпадает с твоим, пакет игнорируется. При этом ничего в области данных менять не надо.


"RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Отправлено uncle Bob , 22-Мрт-02 12:39 
>
>Кстати, в качестве подобной метки может
>служить обратный адрес - если
>он совпадает с твоим, пакет
>игнорируется. При этом ничего в
>области данных менять не надо.
>

Согласен. Можно использовать и такой вариант.