Объединенный Открытый Проект - Сайт для Настоящих Компьютерщиков

Объединенный Открытый Проект

Сайт для Настоящих Компьютерщиков

; Логин:
  Пароль:
Обычный
Безопасный
Запомнить пользователя



Зарегистрироваться
Забыли пароль?
 
 
 
Объединенный Открытый Проект »   Программирование »   Общие вопросы »   Treading и его лимитирование
RSS

Treading и его лимитирование

Текущий рейтинг темы: Нет

<<Назад  Вперед>>Печать
 
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
Как корректно сделать telnet threading с определённым лимитом, например 30 коннектов.
Стоит следующая задача:
реализовать подачу определённой команды серверу, точнее открывать сразу несколько коннектов и подавать команду, но команда от коннекта к коннекту отличается одним значением.
Это цифровое значение выбирается из базы данных (PostgreSQL). Привышать кол-во открытых соединений - нельзя.
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
А на чем пишешь и что используешь в качестве Telnet-сервера (или Socket-сервера)?

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
сервер - не важен. Там используется обычный плейн-текст. Сервер сам всё распознает и выполнит.С Сервером всё впорядке, главное - это клиент.

Подумываю написать на Perl, хотя прикола ради может на питоне реализую.
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Не, я думал, может на Delphi...
Вообще, максимальное количество допустимых подключений надо указывать при создании серверного сокета. Если конкретно, это делается при вызове функции listen (а вот более точно сказать не могу). Но это ограничивает только общее число соединений?
Если задача стоит сложнее и требуется каждому клиенту разрешать определенное количество соединений и оно - разное, то надо создать хеш, в котором ключи - это логины (или uidы) клиента, а значения - количество подключений. Соотвтственно, при покдлючении мы сравниваем значение хеша с макс. числом соединений для клиента, и если оно не превышает, то увеличиваем его на единицу и даем клиенту доступ, иначе - закрываем соединение.
Только вот такая идея не будет работать в случае, если ты обработку ведешь с помощью fork, так как у каждого процесса будет своя копия хеша. В этом случае придется выносить его либо в текстовый файл, либо в отдельную таблицу в БД.

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
Там нет авторизации.
Действия происходят локально. Следует ограничивать именно на стороне клиента.
Клиент при помощи сокетов должен открывать 30 подключений и писать туда разные команды, по завершению оных следует отключатся и далее идти по циклу, пока все данные из базы не будут отправлены.
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Т.е. требуется ограничить не входящие серверные подключения, а исходящие клиентские? Чего-то я не понимаю... А зачем такое надо и что ты вообще пытаешься сделать?

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
У Asterisk'a есть Asterisk Call manager. Он висит на определённом порту и выводит в него данные, а так же можно отправлять туда определённые команды. В моём случае я отправляю команду инициализации звонка.
Сократим описание. Допустим эта команда:
Call: Channel/NUMBER
телефонные номера хранятся в БД.
Таким образом надо обзванить все телефоны, выбрав их по определённым критериям.
Соединение идёт через PRI, что само по себе ограничивает кол-во устанавливаемых call-соединений.
Вобще E1 - 32 канала поддерживает, но часть из них (зависит от настроек) зарезервировано под data-connection.
Допустим у нас есть 30 каналов.
Задача: написать сокет-клиента, который выбирает из базы телефонные номера и передаёт их Астериску, но лимитирует кол-во одновременных коннектов.
4X_Pro
Руководитель Проекта
Настоящий Компьютерщик
4X_Pro
Откуда: Москва
Всего сообщений: 2994
Рейтинг пользователя: 79





Дата регистрации на форуме:
29 сен. 2001
Ну тогда, по идее все почти просто: либо делаешь fork, либо порождаешь новый поток и в нем устанавливаешь соединение. А чтобы количество не превышало заданное советую использовать семафор. (Правда, в Unix я его никогда сам не пытался использовать.)

---
Каждый человек всегда может найти, чем он может быть полезен окружающим. Проблема только в одном: слишком многие не хотят это искать.
wsx
Участник Проекта
Юниксойд, сетевик
wsx
Откуда: Казань
Всего сообщений: 1074
Рейтинг пользователя: 28

Репутация пользователя: 1




Дата регистрации на форуме:
14 янв. 2005
Мдя..Не тАк всё просто, как на самом деле!
<<Назад  Вперед>>Печать
Объединенный Открытый Проект »   Программирование »   Общие вопросы »   Treading и его лимитирование
RSS
Быстрый переход в раздел:


Время выполнения скрипта: 0.0362. Количество выполненных запросов: 19, время выполнения запросов 0.0233