LINUX.ORG.RU

TCP-прокси на epoll


0

1

Нужен простой tcp-прокси. Набросал примерную схему. Оцените пожалста, мож есть какие-нибудь подводные камни в работе с сетью или epoll в частности.

Схема работы прокси
-------------------
Для нотификации событий на дискрипторах сокетов используем API epoll в режииме Edge Triggered
Рассматриваем пары сокетов:

[C]lient-клиентский сокет, [S]erver-серверный сокет

В первоначальном состоянии для обоих дискрипторов устанавливаем нотификацию только EPOLLIN;
INIT_STATE: [S]-->|proxy|<--[C]

Как только на одном из сокетов возникает событие EPOLLIN, для наглядности на [C]:
...а) Вычитываем данные из сокета [C]
...б) Выключаем нотификацию [С] на событие EPOLLIN
...в) Включаем нотификацию [S] на событие EPOLLOUT
...г) Пишем в сокет [S] данные, полученные из [С]
...д) Как только на сокете [S] возникает событие EPOLLOUT (значит,
данные серверу отправлены и можно слать еще), выключаем нотификацию EPOLLOUT на [S] и включаем нотификацию события EPOLLIN на сокете [С].

Тиким образом при завершении пункта д), мы переводим прокси в начальное состояние INIT_STATE.

Пункты а)-д) описывают рабочий цикл прокси в «одну сторону», но ничего нам не мешает проходить этот цикл в обе стороны «одновременно».

Принцип того, что из приемного сокета не читаем до тех пор, пока не переслали ранее из него же полученное, объясняется тем, что поступая иначе мы будем буферизировать данные.

Ответ на: комментарий от am1808

используй nonblocking socket

Использование неблокируемых сокетов-как день божий ясно. Интересуют бреши в самом принципе работы

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