![]() |
Модераторы: feodorv |
![]() ![]() ![]() |
|
sofen |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.5.2011 Репутация: нет Всего: нет |
Поясните, плиз, как правильно написать сервер для работы с несколькими клиентами через сокеты (с++, линукс) ?
|
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
||||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
http://www.proklondike.com/books/unix/robachevsky_unix.html
а если кратко, после каждого соединения нужно отдавать обработку отдельному потоку или процессу, что бы освободить поток, слушающий на порту. иначе другие клиенты, кроме текущего, не смогут подсоединиться. с другой стороны, нужно использовать неблокирующие функции типа select, epool, iocp. в C++ есть высокоуровневые библиотеки, скрывающие всю эту мутотень внутри, напр. boost::asio |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
по той ссылке что я привел, 'struct server_impl' правильней назвать session. ибо это объект сессии создаваемый сервером для каждого входящего соединения.
каждый такой объект, имеет ссылку на 'struct global_context', в которой реализована глобальная логика + глобальные данные. так, к примеру, несколько недель назад, на базе этого набора классов, написал мессенждевую сеть для некой конторы, за два дня. с авторизацией+логами+списком контактов+групповой рассылкой ![]() и то, больша часть времени ушла на гуй. Это сообщение отредактировал(а) boostcoder - 28.5.2012, 14:47 |
|||
|
||||
sofen |
|
||||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.5.2011 Репутация: нет Всего: нет |
boost - это, конечно, интересно, но хотел разобраться в самом механизме... вот здесь http://www.rsdn.ru/article/unix/sockets.xml нашёл следующий код сервера
получается так: 1. вначале создаём listener - слушающий сокет 2. потом sock - сокет для получения/передачи данных 3. читаю сервером данные, обрабатываю и отсылаю ответ и теперь возникают непонятки - зачем закрывать сокет? close(sock); и потом опять его создавать, переходя по циклу while (1) ? sock = accept(listener, NULL, NULL); |
||||
|
|||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
увольте. я не могу такое объяснять ![]() даже заметку по этому поводу написал. эх...закончить бы ее еще.. Добавлено через 12 минут и 3 секунды ладно... до строки закрытия сокета программа досдет только в случае обрыва соединения. а если соединение оборвалось, зачем держать сокет открытым? потому что переходя к началу цикла, программа остановится на аксепте в ожидании нового подключившегося. и после его подключения, снова начнется чтение/запись в/из сокета. |
|||
|
||||
baldina |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
читайте Робачевского, там все просто и понятно.
accept - прием запроса на соединение (от очередного клиента) пример этого эхо-сервера - простейший, он обслуживает только одного клиента в единицу времени. Добавлено через 13 минут и 41 секунду
не совсем. 1. socket() - создаем сокет как набор параметров соединения (протокол, тип) 2. bind() - связываем его с сервером (т.е. захватываем ресурс в нашей системе) - адрес, порт 3. listen() - инициируем процесс "прослушивания" входящих соединений для очередного входящего соединения (инициированного клиентом) 4. accept() - принимаем запрос на соединение [пакет с флагом SYN], с этого момента соединение установлено 5. read/write читаем/пишем в стиле обычного файлового ввода/вывода [пакеты с флагом SYN-ASK/ASK] 6. close() - закрываем соединение, соединение разрывается [пакет с флагом FIN] |
||||
|
|||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
accept возвращает дескриптор (socket) - аналог дескриптора файла |
|||
|
||||
sofen |
|
|||
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 26.5.2011 Репутация: нет Всего: нет |
ок, читаю... у него в книжке есть пример, возможно, решение моей задачи - попробую реализовать... посмотрим, что получиться... |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 13 Всего: 110 |
а разве где-то в теме озвучена ваша задача? оО Добавлено через 32 секунды перечитал тему еще раз. и правда, нигде не озвучена. а телепаты нынче в дефиците. |
|||
|
||||
baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: нет Всего: 101 |
||||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |