Использование Socket с таймером
Добрый день, реализовал соединение клиент-сервер через Socket, сервер повесил слушать в отдельный поток, необходимо проверять какое количество сообщений приходит за указанное время (в мс). Не могу понять как соединить сокеты и таймер. Подскажите пожалуйста как это правильно будет реализовать?
P.S. Таймер использую Multimedia.Timer
Добавлено через 12 часов 3 минуты
Может можно вынести таймер глобально и просто проверять на определенное время?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Использование прокси при соединении с сервером по TCP. Класс Socket
Как реализовать использование прокси в клиенте, чтобы тот соединялся с сервером по TCP и по.
Здравствуйте. Передо мной стоит задача: Реализовать программу (сервер или web-сервер).
Использование ServerSocket.Socket.Connections[i]
Люди. Помогите плиз! Я никак не могу въехать в работу Соккетов. Я посмотрел Чат, который.
Невозможно создать Socket: Socket sock = new Socket(someHostString,somePortInt);
Народ! Помогите пожалуйста. Вся красота губится на exception что выскакивает в момент создания.
100мс, сохраняет принятые данные, если данные не удовлетворяют до окончания времени его работы, скидывает все в ноль и по новой
Решение
kingzfate, я не совсем понял что имелось в виду)
Но если таймер уже есть и от него неможно избавиться, то можно сделать просто: при приёме сообщения увеличивать глобальный счётчик (или один из группы счётчиков, если потоков будет много).
Таймер раз в секунду будет снимать показание счётчика и сбрасывать его в нуль.
у сокетов есть методы чтения блокирующий и неблокирующий. Первый можно запустить в отдельном потоке/таске. Об блокирует вызывающий поток, пока не будут получены данные, или не истечёт таймаут.
Т.е. запускаем на получение данных сокет в отдельном потоке/таске, данные получили — передаём в модель для обработки, сокет снова ставим на чтение.
Неблокирующий ещё проще, он уже выполняется асинхронно в пуле потоков. В него передаётся делегат метода, который будет выполняться при получении данных. Т.е. поставили слушать и занимаемся своими делами. Данные пришли — вызвался делегат, в нём произвели вычитку полученных данных, что-то с ними сделали и снова поставили сокет на асинхронное чтение.
Основная суть — данные будут получены сразу, а не по таймауту.
Добавлено через 1 час 31 минуту
Источник
Как установить тайм-аут сокета в C при создании нескольких соединений?
Я пишу простую программу, которая делает несколько подключений к разным серверам для проверки статуса. Все эти соединения построены по требованию; до 10 соединений можно создать одновременно. Мне не нравится идея одного потока на сокет, поэтому я сделал все эти клиентские сокеты неблокирующими и бросил их в пул select ().
Он работал отлично, пока мой клиент не пожаловался, что время ожидания слишком долго, прежде чем они могут получить отчет об ошибке, когда целевые серверы перестал отвечать.
Я проверил несколько тем на форуме. Некоторые предположили, что можно использовать сигнал тревоги() или установить тайм-аут в вызове функции select (). Но я имею дело с несколькими соединениями, а не с одним. Когда происходит сигнал тайм-аута процесса, я не могу отличить соединение тайм-аута среди всех других соединений.
есть ли в любом случае, чтобы изменить продолжительность таймаута системы по умолчанию?
5 ответов:
вы можете использовать параметры сокета SO_RCVTIMEO и SO_SNDTIMEO для установки таймаутов для любых операций сокета, например:
Edit: С setsockopt на странице:
SO_SNDTIMEO есть возможность установить значение тайм-аута для операций вывода. Он принимает параметр struct timeval с количеством секунд и микросекунд, используемых для ограничения ожидания завершения операций вывода. Если операция отправки была заблокирована в течение этого времени, она возвращает с частичным подсчетом или с ошибкой EWOULDBLOCK, если данные не были отправлены. В текущей реализации этот таймер перезапускается каждый раз, когда дополнительные данные доставляются в протокол, подразумевая, что ограничение применяется к выходным частям, варьирующимся по размеру от отметки низкой воды до отметки высокой воды для вывода.
SO_RCVTIMEO — это опция для установки значения таймаута для операций ввода. Он принимает параметр struct timeval с количеством секунд и микросекунд, используемых для лимит ожидания для операций ввода, чтобы завершить. В текущей реализации этот таймер перезапускается каждый раз, когда дополнительные данные принимаются протоколом, и таким образом ограничение фактически является таймером бездействия. Если операция получения была заблокирована в течение этого времени без получения дополнительных данных, она возвращается с коротким счетом или с ошибкой EWOULDBLOCK, если данные не были получены. Параметр struct timeval должен представлять положительный интервал времени; в противном случае setsockopt () возвращает значение с ошибка Эдома.
не уверен, что я полностью понимаю проблему, но думаю, что это связано с тем, что у меня было, я использую Qt с TCP-сокетом, все неблокирующие, как Windows, так и Linux..
хотел получить быстрое уведомление, когда уже подключенный клиент потерпел неудачу или полностью исчез, и не ждать по умолчанию 900+ секунд, пока не будет поднят сигнал разъединения. Трюк, чтобы получить эту работу, состоял в том, чтобы установить параметр сокета TCP_USER_TIMEOUT слоя SOL_TCP на требуемый значение, заданное в миллисекундах.
это сравнительно новый вариант, пожалуйста см. http://tools.ietf.org/html/rfc5482, но, видимо, он работает нормально, попробовал его с WinXP, Win7/x64 и Kubuntu 12.04/x64, мой выбор 10 s оказался немного дольше, но намного лучше, чем все остальное, что я пробовал раньше ; -)
единственная проблема, с которой я столкнулся, заключалась в том, чтобы найти правильные включения, поскольку, по-видимому, это не добавлено в стандартный сокет (пока..), так что наконец-то я определил их сам следующим образом:
настройки этой опции сокета работает только тогда, когда клиент уже подключен, строки кода вида:
и сбой начального соединения улавливается таймером, запущенным при вызове connect (), так как для этого не будет сигнала Qt, сигнал подключения не будет поднят, так как не будет соединения, и сигнал разъединения также не будет поднят, так как еще не было соединения..
не можете ли вы реализовать свою собственную систему тайм-аута?
держите отсортированный список, или еще лучше приоритетную кучу, как предлагает хит, событий тайм-аута. В вызовах select или poll используйте значение тайм-аута из верхней части списка тайм-аут. Когда этот тайм-аут прибывает, выполните это действие, прикрепленное к этому тайм-ауту.
это действие может заключаться в закрытии сокета, который еще не подключен.
connect тайм-аут должен обрабатываться с помощью неблокирующего сокета (GNU LibC документация on connect ). Вы получите connect вернуться немедленно, а затем использовать select ждать с таймаутом для завершения соединения.
конечно, первый ответ является лучшим. Могу я кое-что добавить?
после 2 setsockopt Вы можете контролировать, если клиент прошел тест тайм-аута, или не удалось с этим:
Источник
Как настроить тайм-аут подключения сокета
когда клиент пытается подключиться к отключенному IP-адресу, существует длительный тайм-аут более 15 секунд. Как мы можем уменьшить этот таймаут? Каков способ его настройки?
код, который я использую для настройки подключения сокета, выглядит следующим образом:
10 ответов:
Я нашел это. Проще, чем принятый ответ, и работает с .NET v2
Я просто написал класс расширения, чтобы разрешить тайм-ауты в соединениях. Используйте его точно так же, как вы бы использовали стандартный Connect() методы, с дополнительным параметром с именем timeout .
Я не программирую на C#, но в C мы решаем ту же проблему, делая сокет неблокирующим, а затем помещая fd в цикл select/poll со значением тайм-аута, равным количеству времени, которое мы готовы ждать успешного подключения.
нашел этой для Visual C++ и объяснение там также склоняется к механизму выбора / опроса, который я объяснил ранее.
по моему опыту, вы не можете изменить значения времени ожидания подключения в розетку. Изменения это для всех (путем настройки параметров ОС).
Я решил проблему с помощью сокетов.Метод ConnectAsync вместо сокета.метод Connect. После вызова сокета.ConnectAsync (SocketAsyncEventArgs), запустите таймер (timer_connection), если время истекло, проверьте, подключено ли соединение сокета(if (m_clientSocket.Подключен)), если нет, всплывает ошибка тайм-аута.
проверьте это на MSDN. Не похоже, что вы можете сделать это с помощью реализованных свойств в классе сокета.
Плакат на MSDN на самом деле решил свою проблему С помощью резьбы. У него был основной поток, который вызывал другие потоки, которые запускали код соединения в течение нескольких секунд, а затем проверяли свойство Connected сокета:
Я создал другой метод, который на самом деле подключил розетку . было главное нить сна в течение 2 секунд, а затем проверьте способ подключения (который выполняется в отдельном потоке), если розетка была подключена хорошо в противном случае исключение «тайм-аут» и вот и все. Еще раз спасибо за отвечает.
Что вы пытаетесь сделать, и почему он не может ждать 15-30 секунд, прежде чем тайм-аут?
У меня была такая же проблема при подключении к сокету ,и я придумал следующее решение, оно отлично работает для меня. —
Я работал с Unity и имел некоторые проблемы с BeginConnect и другими асинхронными методами из сокета.
есть что-то, чем я не понимаю, но примеры кода, пока не работает для меня.
поэтому я написал этот кусок кода, чтобы заставить его работать. Я тестирую его в сети adhoc с android и ПК, а также в локальном на моем компьютере. Надеюсь, это поможет.
и там очень простой сторожевой пес на C#, чтобы заставить его работать:
Это похоже на ответ FlappySock, но я добавил к нему обратный вызов, потому что мне не понравился макет и как возвращалось логическое значение. В комментариях к этому ответу от Ника Миллера:
Источник
Таймер-розетка электронный? Кто пользуется?
Вопрос к тем кто использует похожий электронный таймер.
Есть ли в нем, функция обратного отсчета, или что-то в этом плане, при задании определенного времени после которого он включится. Мм.. запутанно выходит.
Вообщем идея такова. Настроить таймер на ежедневное включение света в аквариуме, скажем с 10:00 утра до 22:00 вечера (это ясно, все таймеры такое умеют). Но, интересует возможность ручного (не автоматического в определенное время, а именно ручное) отключения света на пару часов, скажем покидаешь помещение в 13:00, клацаешь по таймеру и он вырубает свет до 15:00, а затем снова включается и дорабатывает свой остаток до полного отключения в 22:00 (время может отличаться по разному вне зависимости от дня недели, 12до14, 15до17, 18до20, точный график просчитать невозможно, а интересует отключение света в то время когда сам покидаешь помещение).
Т.е. Вам надо что бы он включался не в заданное время после ручного выключения, а через заданный промежуток времени. Нет, такой функции в нем не замечал.
Нет такой функции в данном таймере
Изменено 3.4.11 автор Phantom-of-the-opera
немного не понятно в чем смысл?
Какая требуется логика работы? Объясните подробнее?
Вариант:
1. программа вкл 10-00 откл 22-00
2. программа вкл 12-00 откл — нет
3. пронрамма вкл 14-00 откл -нет
4. программа вкл 16-00 откл -нет
и т.п.
Отключение таймера производить нижней третьей кнопкой (после отключение обязательно еще одно нажатие для перевода в авто режим)
Такое пойдет? конечно ровно 2 часов простоя не получится, но хоть что-то. (интервал можно и 3 часовой задать)
Да, можно использовать комбинацию из имеющихся 10 программ. Но это не «обратный» отсчет на заданное время. Именно такового в данном таймере нет. Если честно, то я не понял зачем топикстартеру такой режим потребовался.
Да, можно использовать комбинацию из имеющихся 10 программ. Но это не «обратный» отсчет на заданное время. Именно такового в данном таймере нет. Если честно, то я не понял зачем топикстартеру такой режим потребовался.
Улыбнуло ) Нет, не бомбу
Такое замудрение связанно с тем, что охота видеть светящийся аквариум как можно больше времени, но так как более 10ти-11ти часов подавать свет не рекомендуется. да и видел что советуют делать двух-часовой перерыв на протяжении суток.
Сейчас стоит обычный механический таймер в котором настроен режим с10до15 и с17до22. Но так как покидать помещение приходится не всегда именно в это время, то приходится наблюдать темный аквариум, что особо глаз не радует.
Вот и подумал сменить таймер на электронный, если конечно же в нем как-то можно настроить чтобы в определенное время, вручную, можно было б отключать свет, который автоматически включится сам через два часа.
Источник