| Асинхронные сокеты | |
| От: | Аноним 833 | ||
| Дата: | 18.03.10 16:42 |
| Доброго времени суток. Возникла необходимость написать сервер на асинхронных сокетах под Linux. Язык реализации C++. Задача у сервер простая — принять пакет на сокете A отправить его на сокет B. Правильно ли я понимаю что асинхронные и неблокирующие сокеты это одно и тоже? Сервер должен выдерживать большую нагрузку 5000-10000 клиентов. Также возник вопрос как реализовать n асинхронных сокетов на один поток, для респределения нагрузки по потокам. У меня есть оптыт сетевого программирования под Win и под Linux, но до этого писал только на блокирующих сокетах. Где можно прочитать про асинхронные сокеты, простые примеры с ними и найти пример с n сокетов на поток? Буду рад любой помощи по теме. Заранее спасибо! |
| Re: Асинхронные сокеты | |
| От: | -prus- | ||
| Дата: | 18.03.10 16:56 |
| Здравствуйте, Аноним, Вы писали: А>Где можно прочитать про асинхронные сокеты, простые примеры с ними и найти пример с n сокетов на поток? А>Буду рад любой помощи по теме. Заранее спасибо! Книжки: 1. UNIX. Разработка сетевых приложений (У. Р. Стивенс, Б. Феннер, Э. М. Рудофф) 2. Шон Уолтон. Создание сетевых приложений в среде Linux. 2001 С уважением, Евгений |
| Re: Асинхронные сокеты | |
| От: | Temoto | ||
| Дата: | 18.03.10 17:02 |
| Здравствуйте, Аноним, Вы писали: А>Доброго времени суток. А>Возникла необходимость написать сервер на асинхронных сокетах под Linux. Язык реализации C++. А>Задача у сервер простая — принять пакет на сокете A отправить его на сокет B. Для такой задачи не надо ничего писать. Есть готовый софт. Гуглить port forward. И уж точно не надо насиловать себя C++ ом. Вот ваша задача, решённая в 10 строк на питоне. http://eventlet.net/doc/examples.html#port-forwarder А>Правильно ли я понимаю что асинхронные и неблокирующие сокеты это одно и тоже? Да. А>Сервер должен выдерживать большую нагрузку 5000-10000 клиентов. Это всё равно что "мне нужен мощный компьютер, выдерживающий большую нагрузку 20 фотошопов". Нагрузка это количество запросов/пакетов в секунду, а не количество возможно спящих клиентов. А>Также возник вопрос как реализовать n асинхронных сокетов на один поток, для респределения нагрузки по потокам. Не получится никакого распределения нагрузки по потокам, потому что нагрузки на процессор в вашей задаче нет. В программе, которая работает только с сетью OS потоки могут только мешать. А>У меня есть оптыт сетевого программирования под Win и под Linux, но до этого писал только на блокирующих сокетах. А>Где можно прочитать про асинхронные сокеты, простые примеры с ними и найти пример с n сокетов на поток? Boost.asio, man socket, read, write. А>Буду рад любой помощи по теме. Заранее спасибо! |
| Re[2]: Асинхронные сокеты | |
| От: | InstantI | ||
| Дата: | 18.03.10 17:12 |
| Здравствуйте, Temoto, Вы писали: T>Для такой задачи не надо ничего писать. Есть готовый софт. Гуглить port forward. Дело в том что задача не настолько тривиальная как я написал. Решалось бы все просто пробросом портов, таких вопросов бы не возникло. Но вцелом картина принять на A отправить на B, прочитать ответ отправить на A. Это только вцелом. Повторюсь что готовых реализаций именно под мою ситуацию не существует. |
| Re[3]: Асинхронные сокеты | |
| От: | Nem | ||
| Дата: | 19.03.10 07:29 |
| Попробуй действительно начать со Стивенса. Он понятно пишет. Потом посмотри C10K и "FAQ appendix 1: как писать сервера" например здесь. Общая идея достаточна тривиальна. У тебя есть куча сокетов, которые ты все скопом отдаешь одной функции (select/poll/epoll/kqueue). И когда хотя бы один из них перейдет в нужное тебе состояние (есть данные для чтения, можно посылать еще, etc) функция тебе сигнализирует. Удобно использовать libevent или libev, чтобы самому не заморачиваться подробностями реализации всех методов (select/...). |
| Re: Асинхронные сокеты | |
| От: | abrec | ||
| Дата: | 20.03.10 08:49 |
| Здравствуйте, Аноним, Вы писали: А>Доброго времени суток. А>Возникла необходимость написать сервер на асинхронных сокетах под Linux. Язык реализации C++. А>Задача у сервер простая — принять пакет на сокете A отправить его на сокет B. А>Правильно ли я понимаю что асинхронные и неблокирующие сокеты это одно и тоже? А>Сервер должен выдерживать большую нагрузку 5000-10000 клиентов. А>Также возник вопрос как реализовать n асинхронных сокетов на один поток, для респределения нагрузки по потокам. А>У меня есть оптыт сетевого программирования под Win и под Linux, но до этого писал только на блокирующих сокетах. А>Где можно прочитать про асинхронные сокеты, простые примеры с ними и найти пример с n сокетов на поток? А>Буду рад любой помощи по теме. Заранее спасибо! boost::asio!!! |
| Re: Асинхронные сокеты | |
| От: | abrec | ||
| Дата: | 20.03.10 08:51 |
| Здравствуйте, Аноним, Вы писали: А>Доброго времени суток. А>Возникла необходимость написать сервер на асинхронных сокетах под Linux. Язык реализации C++. А>Задача у сервер простая — принять пакет на сокете A отправить его на сокет B. А>Правильно ли я понимаю что асинхронные и неблокирующие сокеты это одно и тоже? А>Сервер должен выдерживать большую нагрузку 5000-10000 клиентов. А>Также возник вопрос как реализовать n асинхронных сокетов на один поток, для респределения нагрузки по потокам. А>У меня есть оптыт сетевого программирования под Win и под Linux, но до этого писал только на блокирующих сокетах. А>Где можно прочитать про асинхронные сокеты, простые примеры с ними и найти пример с n сокетов на поток? А>Буду рад любой помощи по теме. Заранее спасибо! boost и для сокетов и для потоков и для процессов. |