The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Сообщение от YaS Искать по авторуВ закладки on 14-Мрт-02, 02:29  (MSK)
есть программа в ней открыт сокет 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) ?
а потом сново разблокировать, что-то типа.
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Сообщение от uncle Bob emailИскать по авторуВ закладки on 20-Мрт-02, 16:17  (MSK)
А если создать два сокета, один для чтения, другой для записи?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: socket(AF_PACKET,SOCK_RAW,ETH_P_ALL), дубль два"
Сообщение от uncle Bob emailИскать по авторуВ закладки on 21-Мрт-02, 20:14  (MSK)
>
>А это работает ? Проверено ?

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

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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

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


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру