Unable timer socket как настроить

Использование Socket с таймером

Добрый день, реализовал соединение клиент-сервер через Socket, сервер повесил слушать в отдельный поток, необходимо проверять какое количество сообщений приходит за указанное время (в мс). Не могу понять как соединить сокеты и таймер. Подскажите пожалуйста как это правильно будет реализовать?

P.S. Таймер использую Multimedia.Timer

Добавлено через 12 часов 3 минуты
Может можно вынести таймер глобально и просто проверять на определенное время?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Использование прокси при соединении с сервером по TCP. Класс Socket
Как реализовать использование прокси в клиенте, чтобы тот соединялся с сервером по TCP и по.

Использование socket
Здравствуйте. Передо мной стоит задача: Реализовать программу (сервер или 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. Но так как покидать помещение приходится не всегда именно в это время, то приходится наблюдать темный аквариум, что особо глаз не радует.

Вот и подумал сменить таймер на электронный, если конечно же в нем как-то можно настроить чтобы в определенное время, вручную, можно было б отключать свет, который автоматически включится сам через два часа.

Источник

Читайте также:  Не работает кондиционер мицубиси как
Оцените статью