Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Icarus7
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 3
1

Клиент-сервер TCP через маршрутизатор

12.03.2018, 12:34. Просмотров 284. Ответов 5
Метки нет (Все метки)

Пишу программу для сетевого взаимодействия клиент-сервер. Назначение - возможно чат.
Писал на блокирующих сокетах TCP по документации MSDN
Алгорит:
В отдельном потоке запускаем TCPListener.
При подключении клиента отправляем его в отдельный поток и продолжаем слушать.
В потоке принимаем сообщение от клиента и отправляем ему ответ. После этого разрываем соединение с клиентом.

В локальной сети все работает отлично. Но если коннектиться через интернет и на пути есть маршрутизатор,
то возникает интересная ситуация в которой не могу разобраться.

Клиент1 (комп).......Клиент2 (ноут)
...192.168.0.5..........192.168.0.6
...............\............/
............Маршрутизатор
...............10.11.15.10 (статический IP)
......................|
................ИНТЕРНЕТ
......................|
..............45.10.12.15 (статический IP)
.................Сервер

Я могу подключиться с Клиента1 на сервер и обмениваться информацией в 2 стороны (прием-передача)
Но сервер определяет адрес клиента как адрес маршрутизатора. Это и понятно, т.к. другая подсеть.
Т.е. с сервера я никак не могу установить соединение с клиентом.
Думаю решить эту проблему с поддержанием во включенном состоянии соединений с каждым клиентом.
Но тут тоже проблема: TCPClient может находиться в 2 состояниях - прием или передача сообщений.
Если я перевожу клиента на прием, то он не сможет отправить сообщение серверу и наоборот.
Чат CommFort работает с такой проблемой, правда проблема видна в адресах клиентов -
они все показывают адрес маршрутизатора.
Как можно решить эту проблему?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2018, 12:34
Ответы с готовыми решениями:

TCP клиент-сервер через интернет
Ситуация такая: Есть два компа. На одном сервер на другом клиент. Все реализована на...

TCP/IP клиент-сервер
Подскажите пожалуйста, как реализовать взаимодействие клиентского и серверного приложения по...

TCP клиент-сервер
Есть у кого нибудь простой работающий пример TCP соединения клиент-сервер допустим для отправки...

TCP (Клиент-сервер) - потеря данных
Добрый день, меня интересует такой вопрос, я имею два приложения клиент-сервер написанные на TCP с...

программа, которая отсылает на сервер пакеты через TCP протокол
Есть программа, которая отсылает на сервер пакеты через TCP протокол, она их и получает. Необходимо...

5
Storm23
Эксперт .NETАвтор FAQ
7148 / 4232 / 1550
Регистрация: 11.01.2015
Сообщений: 5,488
Записей в блоге: 32
13.03.2018, 16:27 2
Цитата Сообщение от Icarus7 Посмотреть сообщение
Но тут тоже проблема: TCPClient может находиться в 2 состояниях - прием или передача сообщений.
С чего вы взяли? TCPClient работает в обе стороны.
Цитата Сообщение от Icarus7 Посмотреть сообщение
Как можно решить эту проблему?
Оба клиента подключаются к серверу (то есть TCPListener работает только на сервере, у клиентов - TCPClient). Подключение держится постоянно, без отключения.
Далее, сервер читает входящие сообщения от клиентов и пересылает эти сообщения другому клиенту (который уже подключен к серверу).
0
Syrax
26 / 17 / 15
Регистрация: 09.12.2009
Сообщений: 126
13.03.2018, 23:43 3
Цитата Сообщение от Storm23 Посмотреть сообщение
Подключение держится постоянно, без отключения.
А можно, пожалуйста, подробнее рассказать, что можно делать, чтобы не было отключения? Я полагаю (из-за моей невежественности), что через какое-то время происходит таймаут соединения и соответствующий разрыв.

Я пытался ранее писать маленький консольный чат, в котором даже если постоянно писать, то рано или поздно вылет все равно происходил. Причем на сервере сообщение, что "клиент отключился", а клиент продолжал работать типа в штатном режиме.
0
Storm23
Эксперт .NETАвтор FAQ
7148 / 4232 / 1550
Регистрация: 11.01.2015
Сообщений: 5,488
Записей в блоге: 32
13.03.2018, 23:50 4
Цитата Сообщение от Syrax Посмотреть сообщение
А можно, пожалуйста, подробнее рассказать, что можно делать, чтобы не было отключения?
Для того, что бы не было разрыва по таймауту и что бы и клиент и сервер были уверены, что связь не разорована - нужно время от времени отправлять пару байт "пинга" - фиксированную последовательность байт с помощью которой сервер будет знать что клиент онлайн.
Если клиент не смог отправить пинг - он должен переконектится.
2
Icarus7
0 / 0 / 0
Регистрация: 12.03.2018
Сообщений: 3
14.03.2018, 09:27  [ТС] 5
Цитата Сообщение от Storm23 Посмотреть сообщение
С чего вы взяли? TCPClient работает в обе стороны.
После подключения TCPClient к TCPListener
На стороне сервера получаем stream:
C#
1
2
3
TcpClient client = server.AcceptTcpClient();            
// Get a stream object for reading and writing
NetworkStream stream = client.GetStream();
Затем переводим stream в режим чтения буфера
C#
1
stream.Read(bytes, 0, bytes.Length)
В это время блокируется поток до получения данных.

Как можно одновременно вести обмен информацией в 2 стороны через один stream?
0
Storm23
Эксперт .NETАвтор FAQ
7148 / 4232 / 1550
Регистрация: 11.01.2015
Сообщений: 5,488
Записей в блоге: 32
14.03.2018, 17:55 6
Цитата Сообщение от Icarus7 Посмотреть сообщение
В это время блокируется поток до получения данных.
Как можно одновременно вести обмен информацией в 2 стороны через один stream?
Ну так создайте второй поток, который будет писать данные в стрим.
Или используйте асинхронный режим.
0
14.03.2018, 17:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.03.2018, 17:55

Создать клиент-сервер через интернет. Какие IP следует задать
Товарищи программисты, попаучайте меня, совсем ничего не знаю. Я выхожу в интернет через...

Клиент-сервер: Как определить, что клиент отключился?
Привет. Есть клиент и сервер, при подключении клиента, на сервере создается класс, который содержит...

Клиент-серверное приложение: как определить, что сервер/клиент не отвечает в течении определенного времени
Пишу клиент-серверное приложение. Использую TCPListener и TCPClient. Вопрос: как определить что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru