|
0 / 0 / 0
Регистрация: 03.09.2015
Сообщений: 30
|
|||||||||||
Как определить, что TCP сессия была закрыта на другом конце27.11.2015, 11:18. Показов 7776. Ответов 22
Метки нет (Все метки)
Пишу реализацию сетевого протокола, который работает поверх TCP/IP. Протокол работает по принципу клиент-сервер. Клиент начинает TCP сессию, внутри сессии отправляет запрос, сервер только шлет ответ на запрос. Пар запрос-ответ внутри сессии может быть сколько угодно, сессия по продолжительности не ограничена и завершается на стороне клиента. Сервер многопоточный, поддерживает несколько сессий.
Пишу серверную часть, вопросы по ней. Стартую TcpListener и жду соединения методом Listener.AcceptTcpClient() . Когда приходит входящее соединение, то от TcpListener получаю TcpClient и вызываю в новом потоке свой метод Session. В этом методе происходит весь диалог между сервером и клиентом. После закрытия TCP сессии нужно выйти из метода Session и завершить поток. Все сделано на основе статей по простейшим серверам и по примерам из MSDN. Вот сам метод в котором идет общение внутри сессии (как пример, часть кода вырезано):
0
|
|||||||||||
| 27.11.2015, 11:18 | |
|
Ответы с готовыми решениями:
22
Определить - была ли закрыта форма Как определить, что форма открыта или закрыта
|
|
20 / 20 / 6
Регистрация: 28.02.2011
Сообщений: 535
|
|
| 10.11.2016, 12:14 | |
|
Добрый день, извините что задержался с ответом. Сидел и писал свою реализацию, и теперь на ваш суд выношу словесную реализацию решение своей задачи. Может где то я допустил тотальную ошибку которая мне аукнутся пос же.
На стороне клиента: Что использую: TCPClietn + NetworkStream Создаю два потока, первый поток принимает входящие сообщения, второй поток каждый 2 секунда шлёт "$$KeepAlive$$$" сообщение. На стороне сервера: Что использую: TCPClietn + NetworkStream На каждое соединение я также создаю свой поток но при инициализации NetworkStream я делаю так ReadTimeout = 6000; (6 секунд). Благодаря этому сам NetworkStream следит за тем что время ожидание "$$KeepAlive$$$" сигнала не превышало 6 секунд. Промежуток между сообщениями привысило больше 6 секунд то NetworkStream вызывает Exception и соединение закрывается. Ещё один маленький вопрос, а может зря я начал писать свой протокол тогда когда уже есть что то готовое? буду рад любым комментариям.
0
|
|
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
|||||
| 10.11.2016, 13:11 | |||||
|
Во-вторых, интервал очень маленький. Например, если данные передаются по каналам мобильной связи типа GPRS, то там пакет может "гулять" до полутора минут. 1) Они либо заточены под конкретные задачи, либо универсальны, из-за чего слишком громоздки (например, протокол по ГОСТ Р МЭК 61107) 2) Могут быть рассчитаны на быстрое проводное подключение с гарантированной доставкой (например, Modbus) Если задача узко-специализирована есть смысл написать свой протокол (при учёте, что он небольшой). Или вообще прислушаться к тов. insite2012 и реализовать обмен через WCF (при условии, что у тебя обмен идёт между приложениями).
0
|
|||||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 10.11.2016, 13:24 | |||
|
Если приходит сообщение $$KeepAlive$$$, то посылается ответ "$$OK$$". На обеих сторонах устанавливается таймаут на принятие сообщения. Если произошел таймаут, то посылается сообщение "$$KeepAlive$$$". Если соединение было в полуоткрытом состоянии, то на этом шаге вылетит SocketException. Если после отправки сообщения снова произошел таймаут при приеме, то другая сторона по какой-то причине не отвечает — тут смотрите сами что делать: слушать дальше или попробовать пересоединиться. При таком подходе у вас отпадает необходимость в отдельных потоках и если сообщения будут идти регулярно, то не придется слать keep-alive пакеты.
0
|
|||
| 10.11.2016, 13:24 | |
|
Как в VS откатить файлы кода, если ранее они были уже сохранены и VS была закрыта?
Как указать что форма закрыта, после её открытия и вызова программно Как узнать какой ip-адрес на другом конце кабеля Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео:
https:/ / vkvideo. ru/ video-240781534_456239017
YouTube:
eY5-5PyI9NM
Текстовая версия
|
|
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать
Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
|
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства.
Родственных связей существует 8 ступеней, такие как:
p - отец
P - мать
q - муж
Q - жена
b - брат
B - сестра
s - сын
S - дочь
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|