Лучший способ получить / обработать большое количество пакетов / Traffi c через AF_PACKET Socket + EPoll Вопросы - PullRequest
0 голосов
/ 01 марта 2020

Я создал тестовую C программу, которая создает сокет AF_PACKET, создает x количество потоков с помощью pthreads, и внутри каждого потока выполняет epoll для дескриптора файла сокета , Эта программа была создана для Linux, и я скомпилировал ее с помощью G CC в Ubuntu 18.04. Я отправил GitHub Gist программы здесь , так как это более 200 строк кода. Я все еще довольно плохо знаком с C и сетевым программированием. Поэтому я уверен, что в код можно внести множество улучшений. Я открыт для предложений!

У меня есть два основных вопроса:

  1. Есть ли лучший способ получать и обрабатывать большое количество пакетов / трафика c в программа пользователя пространства, чем выше? Я читал, используя pthreads вместе с epoll, было бы лучшим вариантом, но я также изучил select и стандартные poll.

  2. Когда программа выше выполняется без вывода отладки через fprintf(), каждый поток потребляет 100% ЦП в функции epoll_wait() в течение времени l oop. Это нормальное поведение или я неправильно использую epoll? Я посмотрел на некоторые другие примеры и использую epoll так же, как в примерах. Я посмотрел на страницу руководства для epoll и считаю, что правильно использую ее в моем случае. Я также попытался установить таймаут для функции epoll_wait(), но он по-прежнему потреблял 100% ЦП на поток (что я ожидал из-за времени l oop).

Я планирую создать программу, которая будет перенаправлять трафик c после проверки трафика c, и я ожидаю много входящих пакетов, поэтому я хотел посмотреть, есть ли лучший способ получать и обрабатывать большое количество пакетов. Я также понимаю, что мог бы просто использовать стандартные сокеты SOCK_DGRAM или SOCK_STREAM и связать их с IP-адресом и портом. Однако я хочу обработать и проверить все входящие трафики c на интерфейс и перенаправить трафик c при необходимости (например, если адрес назначения соответствует правилу пересылки). Я также не был уверен, должен ли я сделать несколько сокетов в этом случае (возможно, сокет на поток). Сначала я делал это, но это приводило к неожиданному поведению, и в любом случае он читал только из одного дескриптора сокета. Возможно, я не создавал новые сокеты должным образом.

Любая помощь очень важна, и если вам нужна дополнительная информация, пожалуйста, дайте мне знать.

Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...