| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Сети > Tcp сервер с приоритетным клиентом |
| Автор: Dika 5.2.2013, 11:33 |
| Кодю не под Виндовс, но библиотека похожа на WinSock. У меня однозадачная ОС, для него пишу TCP сервер. Есть 2 клиента. Один клиент (первый) должен обладать приоритетом на работу с сервером, т.е .если сервер обрабатывает запрос от второго клиента, а в это время пришел запрос от первого, то сервер должен прервать текущую операцию, закрыть соединение и открыть соединение для работы с первым клиентом. Как это сделать? Сервер у меня с функцией select(). Может я не правильно понимаю, поправьте: в select есть очередь из клиентов, кто первый пришел, с тем и работает сервер. Как бы в течение работы программы проверять эту очередь, и если есть нужный клиент, то флаг выставлять. Если есть примеры с библиотекой Winsock, давайте, буду перерабатывать под "мое" железо. перефразирую: как определить запрос на подключение к серверу и пока не устанавливать подключения? |
| Автор: feodorv 5.2.2013, 17:02 |
| Какие проблемы? Работайте с неблокируемыми сокетами. И максимум двумя сокетами - одним прослушиваемым, другим присоединённым. Перед каждым read/write/recv/send вызывайте select. Если select даст знать, что привилегированный клиент готов присоединится, закрывайте текущее соединение (если оно открыто), открывайте новое с этим привилегированным клиентом. Добавлено через 13 минут и 8 секунд http://www.lowtek.com/sockets/select.html |
| Автор: Dika 5.2.2013, 21:01 |
| У меня есть долгая операция, занимает 30 сек - это передача файла, не смейтесь. Когда приходит запрос на передачу файла, я его читаю по частям и передаю, т.е. считала часть, передала, считала еще часть, передала и так до конца файла. И в то время, как я передаю файл, может постучаться первый клиент, операцию которого сервер не может не выполнить. вот. сервер физически не может прийти в select, он в цикле передачи файла. В моей машине есть функция прерывания по таймеру, т.е. через заданые промежутки времени я могу сделать какие-либо операции. Так вот, я хочу по прерыванию проверять, если запрос на подключение от нужного клиента, если да, то прервать все операции и выполнить приоритетную. feodorv, неблокируемые сокеты вряд ли подойдут, нужна гарантированая доставка, но только проверка функции select не дает еще соединения, надо попробовать. |
| Автор: Dika 6.2.2013, 08:45 |
| feodorv, ой, я и работаю с неблокирующими сокетами, перепутала с UDP протоколом. Код еще не разбирала, не дошла. |