IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Проблема с клиент-сервером
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Есть клиент-серверное приложение, и в функционале есть чат(личка). Этот чат надо переделать под .net remoting, чтоб клиенты посылали сообщения друг-другу напрямую, не напрягая лишний раз сервак, для это с сервака каждому клиенту посылаются айпи его друзей. Проблема в следующем, если один из клиентов сидит за роутером, то получается с сервака( сервер на с++) отправить лишь айпи роутера
(Function returned:
Official name: homeuser52-36.ccl.perm.ru
Address type: AF_INET
Address length: 4
IPv4 Address #1: 62.16.52.36)
по которому начать взаимодействие клиенты не могут. Как получить полный адрес клиента?
З.Ы. Настройки роутера трогать нельзя.
Оба клиента подключены к серверу, у него есть их адреса, необходимо связать их между собой напряую.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(legat @ 6.10.2010 21:46) *
Как получить полный адрес клиента?
Хороший вопрос )).
Определи, что есть "полный адрес". Ты спрашиваешь о том, чего не существует в природе )).
"Полный" адрес той машины будет адресом в локальной сети, что-то типа 192.168.0.5. И поможет оно тебе? smile.gif
Разберись с тем, как работает NAT.



Добавлено через 2 мин.
P.S.
класс B 192.168.0.0 зарезервирован для локальных сетей, такие ip не маршрутизируются.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


посмотри в сторону dynDNS... либо можно попробовать заморочиться с VPNом.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(мисс_граффити @ 7.10.2010 8:52) *
посмотри в сторону dynDNS... либо можно попробовать заморочиться с VPNом.
Боюсь, dynamic DNS тут ни при чем (что ты имела в виду? blink.gif ). А делать секьюрный канал, когда чел не хочет даже на раутере сделать переброс порта - это тоже выглядит несколько странно..

Я думаю, тут все можно сделать с использованием стандартных средств NAT. Это стандартная задача, по-моему. Да и "делать" ничего не придется, все сделает протокол.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Нашел вот такое: "На атомарном уровне структура Skype-сети состоит из обычных узлов (normal/ordinal node/host/nest), обозначаемых аббревиатурой SC (Skype Client), и super-узлов (super node/host/nest), которым соответствует аббревиатура SN. Любой узел, который имеет публичный IP-адрес (тот, который маршрутизируется в интернет) и обладает достаточно широким каналом, автоматически становится super-узлом и гонит через себя трафик обычных узлов, помогая им преодолеть защиты типа брандмауэров или трансляторов сетевых адресов (NAT) и равномерно распределяя нагрузку между хостами." Кажется придется сделать подобное.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(legat @ 7.10.2010 11:00) *
Кажется придется сделать подобное.
Н-да.. дурная голова ногам покоя не дает..
Не туда копаешь. При чем тут Skype??
Повторяю: ничего делать (в смысле специально программировать) - не нужно. Нужно только ПОНЯТЬ, как работает NAT. Все, больше ничего.
Ты посмотрел описание протокола?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Lapp, я про сервис, который называется dynDNS (сайтик то же, только с com). Наверняка есть аналоги, но я лично только с ним сталкивалась.

Про переброску порта - ну, по условию нельзя трогать настройки роутера...

Сообщение отредактировано: мисс_граффити -


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


"Самостоятельно инициировать соединение внешний узел не в состоянии, поскольку NAT просто не знает, на какой внутренний IP и порт следует транслировать неожиданно сваливавшийся UDP-пакет.
Эта проблема решается протоколом TURN (Traversal Using Relay NAT) "
Сюда копать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(мисс_граффити @ 7.10.2010 11:20) *
я про сервис, который называется dynDNS (сайтик то же, только с com). Наверняка есть аналоги, но я лично только с ним сталкивалась.
ессно, я тоже про него. Есть и другие (я сижу на NoIP). Они все используют dynamic DNS как основу. Но я не могу взять в толк, как оно тут поможет. дело же не в трудностях с запоминанием численного адреса..

Цитата
Про переброску порта - ну, по условию нельзя трогать настройки роутера...
.. и не надо, NAT все сделает за тебя ))


Добавлено через 19 мин.
Цитата(legat @ 7.10.2010 11:25) *
"Самостоятельно инициировать соединение внешний узел не в состоянии, поскольку NAT просто не знает, на какой внутренний IP и порт следует транслировать неожиданно сваливавшийся UDP-пакет.
Эта проблема решается протоколом TURN (Traversal Using Relay NAT) "
Сюда копать?
Нет. Тут речь идет об ИНИЦИАЦИИ СНАРУЖИ. Это действительно непросто. У тебя же не тот случай.

Смотри.

1. внутренний хост А с адресом 192.168.0.5 хочет связаться с сервером С.

2. он шлет пакет на С, в котором обозначены ЕГО айпи и порт, т.е., например, 192.168.0.5:1234

3. NAT-раутер Р (с внешним айпи 5.6.7.8) заменяет исходящие параметры на свой айпи и произвольно выбранный свободный порт: 5.6.7.8:4321

4. с этого момента он слушает свой порт 4321

5. все пакеты, полученные на этот порт, онтправляет на А:1234

Вот, примерно так.. Точнее, так, кажется, работает PAT, который есть часть NAT.
Эта схема позволяет рассортировать входящий трафик. В твоем случае, сервер С, получивший пакет от А, должен послать его айпи И ПОРТ хосту Б. Хост Б шлет на эти входные параметры.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Ок, спасибо, будем пробывать
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


В общем ситуация такая:
Клиент А,который за Nat, устанавливает соединение с сервером через порт 5555, так же он открывает канал, чтоб принимать подключение через remoting, я сделал на 5556. Пусть роутер стал использовать порт 1234, сервер посылает клиенту Б айпи 1.2.3.4 порт 1234, далее клиент Б пытается обратиться к объекту на 1.2.3.4:1234, и нат перебрасывает соответственно на 5555, а надо бы на 5556, есть у кого какие идеи?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(legat @ 7.10.2010 21:00) *
В общем ситуация такая:
Клиент А,который за Nat, устанавливает соединение с сервером через порт 5555, так же он открывает канал, чтоб принимать подключение через remoting, я сделал на 5556. Пусть роутер стал использовать порт 1234, сервер посылает клиенту Б айпи 1.2.3.4 порт 1234, далее клиент Б пытается обратиться к объекту на 1.2.3.4:1234, и нат перебрасывает соответственно на 5555, а надо бы на 5556, есть у кого какие идеи?
Идея такая: пересмотри свою идею.
legat, тебе нужно разобраться, как оно устроено, вникнуть. Понимаешь? Не навязывать свой способ коммуникаций, который тебе пришел в голову когда-то, когда ты услышал про всякие айпи и порты, а делать так, как это делается всеми нормальными людЯми )). Сечешь фишку? Еще разок перечитай то, что ты нашел по NAT/PAT, покрути в мозгах, и делай, как делается. Не пытайся идти против течения. Используй течение в своих целях. Глядишь - бензин сэкономишь и экологию улучшишь.. ))


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Цитата
legat, тебе нужно разобраться, как оно устроено, вникнуть

Я вроде понял, как что устроено.
Цитата
В твоем случае, сервер С, получивший пакет от А, должен послать его айпи И ПОРТ хосту Б. Хост Б шлет на эти входные параметры.

У меня не получается вот именно на эти входные данные послать, а именно создать соединение.
Буду признателен за пример кода)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


А чем тебя не устраивает общение через порт А:5555? Нужно только реализовать еще один уровень (соответствует application) в твоем протоколе связи. То есть изначально, допустим, А общается с С через порт 5555 (это стандартный порт в твоей кухне). И Б тоже общается с С через свой порт 5555. Теперь Б хочет переслать большой блок данных непосредственно А, минуя С. Он шлет С спец запрос на связь с А. С отвечает Б: запрос принят, жди. Потом С говорит А (все по тому же стандартному управляющему каналу, через 5555) : сделай новый канал. Тогда А открывает новый порт (уже случайный, любой свободный) на С. С получает пакет от А и считывает оттуда айпи:порт. Эти данные он передает Б. После этого Б шлет на них, что хотел. Канал закрывается или остается открытым - это все уже вопросы реализации твоего протокола уровня приложения..
Замечание: все, конечно, через UDP.

Что я тут не учел?

С кодом сейчас помочь не смогу.. мож, кто другой? smile.gif


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Спасибо за быстрый ответ=) Такая идея меня тоже посетила.
Но есть некоторые нюансы, а именно:
мне необходимо, чтобы связь между клиентами шла через .net remoting, а сервер у меня под линуксом, отсюда и проблема, что я не могу с А открыть новый канал(о котором бы узнал сервер), данные которого переслать Б.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(legat @ 8.10.2010 1:41) *
мне необходимо, чтобы связь между клиентами шла через .net remoting, а сервер у меня под линуксом, отсюда и проблема,
Дык.
Тут я тебе не помощник.. Совместимость своего софта (клиентского с серверным) обеспечиай сам.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Цитата
А чем тебя не устраивает общение через порт А:5555? Нужно только реализовать еще один уровень (соответствует application) в твоем протоколе связи. То есть изначально, допустим, А общается с С через порт 5555 (это стандартный порт в твоей кухне). И Б тоже общается с С через свой порт 5555. Теперь Б хочет переслать большой блок данных непосредственно А, минуя С. Он шлет С спец запрос на связь с А. С отвечает Б: запрос принят, жди. Потом С говорит А (все по тому же стандартному управляющему каналу, через 5555) : сделай новый канал. Тогда А открывает новый порт (уже случайный, любой свободный) на С. С получает пакет от А и считывает оттуда айпи:порт. Эти данные он передает Б. После этого Б шлет на них, что хотел. Канал закрывается или остается открытым - это все уже вопросы реализации твоего протокола уровня приложения..
Замечание: все, конечно, через UDP.

Сделали вот по этой схеме, все бы хорошо, но есть проблема:
nat все также не пускает к клиенту А, до тех пор, пока клиент А сам не пошлет что-нибудь до клиента Б, после этого все работает нормально
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(legat @ 8.10.2010 23:35) *
nat все также не пускает к клиенту А, до тех пор, пока клиент А сам не пошлет что-нибудь до клиента Б, после этого все работает нормально
yes2.gif Я подозревал, что оно так будет, но решил оставить на потом )) А точнее, положился на твою вот эту фразу:
Цитата
далее клиент Б пытается обратиться к объекту на 1.2.3.4:1234, и нат перебрасывает соответственно на 5555

Молодец, что сам разобрался! ) +1.
Раутер пускает только того, к кому обращался сам. На самом деле, это может работать не везде (типа может зависеть от бренда/модели раутера), поскольку при повторном обращении раутер может использовать другой порт.. Ты, кстати, как тестишь? Один клиент ЗА раутером, а другой - НЕТ? Интересно также посмотреть, как будет работать в случае, когда ОБА ЗА раутерами.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской
Реальное имя: Сергей

Репутация: -  1  +


Цитата
Ты, кстати, как тестишь? Один клиент ЗА раутером, а другой - НЕТ?

Да
Решили, где возможно делать по udp, а если сообщение не дойдут, будем по старинке через сервер
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 4:09
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name