| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Сокеты. Как правильно написать сервер? |
| Автор: sofen 28.5.2012, 13:52 |
| Поясните, плиз, как правильно написать сервер для работы с несколькими клиентами через сокеты (с++, линукс) ? |
| Автор: boostcoder 28.5.2012, 14:08 |
например так: http://code.google.com/p/netclasses/source/browse/trunk/tests/server/server2.cpp |
| Автор: baldina 28.5.2012, 14:22 |
| http://www.proklondike.com/books/unix/robachevsky_unix.html а если кратко, после каждого соединения нужно отдавать обработку отдельному потоку или процессу, что бы освободить поток, слушающий на порту. иначе другие клиенты, кроме текущего, не смогут подсоединиться. с другой стороны, нужно использовать неблокирующие функции типа select, epool, iocp. в C++ есть высокоуровневые библиотеки, скрывающие всю эту мутотень внутри, напр. boost::asio |
| Автор: boostcoder 28.5.2012, 14:44 |
| по той ссылке что я привел, 'struct server_impl' правильней назвать session. ибо это объект сессии создаваемый сервером для каждого входящего соединения. каждый такой объект, имеет ссылку на 'struct global_context', в которой реализована глобальная логика + глобальные данные. так, к примеру, несколько недель назад, на базе этого набора классов, написал мессенждевую сеть для некой конторы, за два дня. с авторизацией+логами+списком контактов+групповой рассылкой и то, больша часть времени ушла на гуй. |
| Автор: sofen 28.5.2012, 14:53 | ||||
boost - это, конечно, интересно, но хотел разобраться в самом механизме... вот здесь http://www.rsdn.ru/article/unix/sockets.xml нашёл следующий код сервера
получается так: 1. вначале создаём listener - слушающий сокет 2. потом sock - сокет для получения/передачи данных 3. читаю сервером данные, обрабатываю и отсылаю ответ и теперь возникают непонятки - зачем закрывать сокет? close(sock); и потом опять его создавать, переходя по циклу while (1) ? sock = accept(listener, NULL, NULL); |
| Автор: boostcoder 28.5.2012, 14:56 |
увольте. я не могу такое объяснять даже http://forum.vingrad.ru/forum/topic-336344.html по этому поводу написал. эх...закончить бы ее еще.. Добавлено через 12 минут и 3 секунды ладно... до строки закрытия сокета программа досдет только в случае обрыва соединения. а если соединение оборвалось, зачем держать сокет открытым? потому что переходя к началу цикла, программа остановится на аксепте в ожидании нового подключившегося. и после его подключения, снова начнется чтение/запись в/из сокета. |
| Автор: baldina 28.5.2012, 15:27 | ||
accept возвращает дескриптор (socket) - аналог дескриптора файла |
| Автор: sofen 28.5.2012, 16:05 | ||
ок, читаю... у него в книжке есть пример, возможно, решение моей задачи - попробую реализовать... посмотрим, что получиться... |
| Автор: boostcoder 28.5.2012, 16:26 |
а разве где-то в теме озвучена ваша задача? оО Добавлено через 32 секунды перечитал тему еще раз. и правда, нигде не озвучена. а телепаты нынче в дефиците. |
| Автор: baldina 28.5.2012, 16:56 | ||
только в данном случае, т.е. только в паре с данным клиентом в общем случае она туда доедет и просто в случае конца файла. и тогда инициатором разрыва будет сервер, а не клиент. |