![]() |
|
Модераторы: feodorv |
![]()
|
|
| Dika |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.10.2011 Репутация: нет Всего: нет |
Кодю не под Виндовс, но библиотека похожа на WinSock. У меня однозадачная ОС, для него пишу TCP сервер. Есть 2 клиента. Один клиент (первый) должен обладать приоритетом на работу с сервером, т.е .если сервер обрабатывает запрос от второго клиента, а в это время пришел запрос от первого, то сервер должен прервать текущую операцию, закрыть соединение и открыть соединение для работы с первым клиентом. Как это сделать?
Сервер у меня с функцией select(). Может я не правильно понимаю, поправьте: в select есть очередь из клиентов, кто первый пришел, с тем и работает сервер. Как бы в течение работы программы проверять эту очередь, и если есть нужный клиент, то флаг выставлять. Если есть примеры с библиотекой Winsock, давайте, буду перерабатывать под "мое" железо. перефразирую: как определить запрос на подключение к серверу и пока не устанавливать подключения? Это сообщение отредактировал(а) Dika - 5.2.2013, 14:17 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Какие проблемы? Работайте с неблокируемыми сокетами. И максимум двумя сокетами - одним прослушиваемым, другим присоединённым.
Перед каждым read/write/recv/send вызывайте select. Если select даст знать, что привилегированный клиент готов присоединится, закрывайте текущее соединение (если оно открыто), открывайте новое с этим привилегированным клиентом. Добавлено через 13 минут и 8 секунд Не идеальный, но подходящий код. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Dika |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.10.2011 Репутация: нет Всего: нет |
У меня есть долгая операция, занимает 30 сек - это передача файла, не смейтесь. Когда приходит запрос на передачу файла, я его читаю по частям и передаю, т.е. считала часть, передала, считала еще часть, передала и так до конца файла. И в то время, как я передаю файл, может постучаться первый клиент, операцию которого сервер не может не выполнить. вот. сервер физически не может прийти в select, он в цикле передачи файла. В моей машине есть функция прерывания по таймеру, т.е. через заданые промежутки времени я могу сделать какие-либо операции. Так вот, я хочу по прерыванию проверять, если запрос на подключение от нужного клиента, если да, то прервать все операции и выполнить приоритетную.
feodorv, неблокируемые сокеты вряд ли подойдут, нужна гарантированая доставка, но только проверка функции select не дает еще соединения, надо попробовать. Это сообщение отредактировал(а) Dika - 5.2.2013, 21:05 |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 10 Всего: 45 |
Как одно зависит от другого? Как раз с неблокируемыми сокетами может. Вы код смотрели? Видели как там в момент работы (чтение/запись) с несколькими клиентами организуется ещё одно соединение с ещё одним клиентом? Откройте для себя мир неблокируемых сокетов!!!))) И, на самом деле, они легко решают проблему... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| Dika |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 19.10.2011 Репутация: нет Всего: нет |
feodorv, ой, я и работаю с неблокирующими сокетами, перепутала с UDP протоколом. Код еще не разбирала, не дошла.
|
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |