-
Вообщем делаю аудио-чат, сделал сервер на node.js (по TCP/IP) при помощи которого оба клиента соединяются между собой. оба клиента получают от сервера на node.js IP и внешний порт своего собеседника. вот как теперь зная эту информацию соединить их по UDP? ведь IP адрес понятно, будет внешний интернетовский, а ПОРТ ведь это порт подключения по TCP/IP? т.е. мне нажно UDP сервер клиента 1 и UDP клиент, клиента 2 соединить напрямую между собой. не могу въехать в реализацию, уже весь интернет перерыл (почти весь, помогите люди дорогие)
-
по UDP не соединяются между собой, UDP это такой протокол по которому клиент кидает пакет по адресу/адресам, и надеется, что там его поймают.
-
я понимаю, но ведь нужно знать куда слать этот UDP правильно? в локалке все просто, а вот интересует реализация из под НАТА
-
я понимаю, но ведь нужно знать куда слать этот UDP правильно? логично. даже бумажное письмо надо знать куда слать.
в локалке все просто, а вот интересует реализация из под НАТА
в нелокалке тоже все просто как и в локалке.
вместо x.x.x.x будет адрес y.y.y.y остальное будет все точно так же
из под НАТА ну пробросить надо. всё входящее по удп на порт nnnn кидать внутрь на нужный ip/порт
-
> ну пробросить надо. > всё входящее по удп на порт nnnn кидать внутрь на нужный > ip/порт
т.е. на сервере я определил внешние IP и порты обоих клиентов и просто слать UDP на этот IP:порт? а в локале слушать на каком порту-то не въеду
-
на сервере у тебя нет никаких внешних ип. твой сервер за натом.
внешний ип у тебя на роутере.
клиент шлет пакеты на адрес роутера. а роутер по правилу которое ты на нем создашь будет кидать эти пакеты на сервер
-
> на сервере у тебя нет никаких внешних ип. > твой сервер за натом.
ну мы просто не правильно поняли друг-друга, сервер для того, чтобы определить внешний IP клиентов, допустим я их получил скажем, Клиент1: 205.12.90.18 и Клиент2: 167.23.78.12 так же можно получить соответсвенно порты (то это порты получаются созданные для tcp соединения, через которые клиенты подрубились к серверу)
> а роутер по правилу которое ты на нем создашь будет кидать > эти пакеты на сервер
создашь? руками в роутер лесть не вариант, т.е. нужна реализация как скажем ICQ передает файл минуя сервер самого ICQ или как теамвьювер или тотже скайп работает без передачи потока через их сервер
-
руками в роутер лесть не вариант
ну лезь ногами. или что там у тебя вместо рук рабочее....
-
а вообще ты сядь, переведи дух и успокойся.
а то сначала у тебя клиенты и сервер за натом. а потом появляется еще какой-то сервер, не за натом, через который "как в скайпе" все должно быть.
ты посчитай сначала сколько у тебя ково есть, нарисуй на бумажке....
-
> или тотже скайп работает на него не стоит ориентироваться, в нем куча всяких, в том числе "вирусных" технологий намешано, и пир ту пир, и левые сервера, и разные порты прослушиваемые в фоновом режиме, и х.з. что еще (а у тебя только UDP). у меня как то в локальной сети через которую у провайдера инет, ничего не было кроме провайдерской странички "нужно оплатить", и скайп... работал как ни в чем не бывало, что то админ провайдера забыл запретить, или сам скайп с сервера юзал, хз. как в общем просто факт, за раз "на коленке" так не сделать.
-
> sniknik
ну я скайп образно привел, а вообще реализация как передача файлов в ICQ или в тех же торрент клиентах вот нарисовал примерно схему, http://s56.radikal.ru/i154/1612/43/1e423ac35b00.jpg черными стрелками обозначены запросы при подключении клиентов к МОЕМУ серверу по TCP, он получает внешние адреса этих клиентов, получив их нужно реализовать прямую связь между ними (синие и зеленые стрелки) по UDP для передачи потокового аудио минуя мой сервер. (вроде как называется это UDP Hole Punching) вот тут я не понимаю, что в качестве портов указывать для UDP сервер-клиента?
-
что в качестве портов указывать для UDP сервер-клиента?
в качестве портов укажи номера портов.
левый слушает порт 666 - скажи правому чтобы пулял на 666 порт правый слушает порт 777 - скажи левому чтобы пулял на порт 777
оба на одном и том же слушают - скажи обоим на один и тот же порт пулять.
-
это понятно, но в том то и дело, что я не пойму, допустим левый говорит правому что пулять на порт 777, т.е. на 203.12.67.12:777? тогда как именно будет этот проброс производится через NAT ведь там в данный момент нет такого условия в таблице? а есть только для 203.12.67.12:45728 -> 192.168.1.5:6778 созданный TCP соединением к моему серверу, или все таки чтобы он пулял на 203.12.67.12:45728 но по UDP? а слушать его в клиенте на порту 6778? я думаю, что так вроде должно быть
-
это понятно, но в том то и дело, что я не пойму,
тут ровно одна половина фразы лишняя.
допустим левый говорит правому что пулять на порт 777,
не левый говорит правому пулять в 777 а ТЫ говоришь правому, чтобы правый пулял левому в 777
-
тогда как именно будет этот проброс производится через NAT ведь там в данный момент нет такого условия в таблице?
у тебя есть знакомая семья. живет по адресу ул ленина д1 кв 2 в семье есть маша, вася и петя.
напиши письмо положи в конверт, и напиши на нем: ленина д1 кв2 лично эмманулилу канту в руки.
потом подумай, получит ли эмануил кант это письмо.
не получит. потому что его по этому адресу нет.
и твой правый клиент ничего не получит, потому что пакет до роутера дойдет, и "остановится"
потому что роутер сам ничего на порту udp/777 не слушает, и понятия не имеет, что пакет предназначен для адреса в его лан сегменте.
-
> потому что роутер сам ничего на порту udp/777 не слушает, > > и понятия не имеет, что пакет предназначен для адреса в > его лан сегменте.
так вот за это я и спрашиваю!! как это сделать!
-
а конкретнее UDP Hole Punching, ICQ это ведь делает!
-
затрудняюсь ответить.
сделать руками - не вариант. сделать ногами - уже было.
ну взглядом попробуй..... хотя завтра же новый год и дед мороз. пиши ему письмо, завтра отдашь.
-
а если NAT за NAT-ом за NAT-ом за NAT-ом ...
-
1. отправляешь с клиента А udp пакет серверу, тот запоминает ип1:порт1, откуда пакет пришел, а на рутере у А создаётся запись в таблице ната 2. отправляешь с клиента B udp пакет серверу, тот также запоминает ип2:порт2, откуда пришло, и рутер В тоже запоминает маппинг 3. сервер сообщает и А, и В ип:порты собеседников теперь А может слать udp "напрямую" на ип2:порт2, а В - на ип1:порт1 вот и весь hole punching; иногда может и не сработать; плюс записи в таблицах ната могут отвалиться по таймауту
|