Я создал тестовую C программу, которая создает сокет AF_PACKET
, создает x количество потоков с помощью pthreads
, и внутри каждого потока выполняет epoll
для дескриптора файла сокета , Эта программа была создана для Linux, и я скомпилировал ее с помощью G CC в Ubuntu 18.04. Я отправил GitHub Gist программы здесь , так как это более 200 строк кода. Я все еще довольно плохо знаком с C и сетевым программированием. Поэтому я уверен, что в код можно внести множество улучшений. Я открыт для предложений!
У меня есть два основных вопроса:
Есть ли лучший способ получать и обрабатывать большое количество пакетов / трафика c в программа пользователя пространства, чем выше? Я читал, используя pthreads
вместе с epoll
, было бы лучшим вариантом, но я также изучил select
и стандартные poll
.
Когда программа выше выполняется без вывода отладки через fprintf()
, каждый поток потребляет 100% ЦП в функции epoll_wait()
в течение времени l oop. Это нормальное поведение или я неправильно использую epoll
? Я посмотрел на некоторые другие примеры и использую epoll
так же, как в примерах. Я посмотрел на страницу руководства для epoll
и считаю, что правильно использую ее в моем случае. Я также попытался установить таймаут для функции epoll_wait()
, но он по-прежнему потреблял 100% ЦП на поток (что я ожидал из-за времени l oop).
Я планирую создать программу, которая будет перенаправлять трафик c после проверки трафика c, и я ожидаю много входящих пакетов, поэтому я хотел посмотреть, есть ли лучший способ получать и обрабатывать большое количество пакетов. Я также понимаю, что мог бы просто использовать стандартные сокеты SOCK_DGRAM
или SOCK_STREAM
и связать их с IP-адресом и портом. Однако я хочу обработать и проверить все входящие трафики c на интерфейс и перенаправить трафик c при необходимости (например, если адрес назначения соответствует правилу пересылки). Я также не был уверен, должен ли я сделать несколько сокетов в этом случае (возможно, сокет на поток). Сначала я делал это, но это приводило к неожиданному поведению, и в любом случае он читал только из одного дескриптора сокета. Возможно, я не создавал новые сокеты должным образом.
Любая помощь очень важна, и если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Спасибо за ваше время.