-
Здравствуйте уважаемые! Предисловие. Server - удаленный udp server. client - клиент UDP client отправляет Server-у пакет UDP через компонент WSocket из набора библиотек ICS от overbyte.be Server принимает пакет и отправляет ответный UDP пакет client-у. client успешно получает. Но если отправлять UDP пакеты с любой другой програмки (например UDP чата) на порт и IP, полученный Server -ом, то client не получает эти пакеты. Почему? Может есть какие то настройки у компонента WSocket на стороне client-а ? Кто пользуется этими компонентами? Подскажите пожалуйста. ------------------------ вырезка кода client-а: WSocket.Addr := '0.0.0.0';
WSocket.Port :=PortUDPServerLeader;
WSocket.Proto := 'udp';
WSocket.Listen; client отправляет пакеты: WSocket.sendto(Addr, sizeof(Addr), Smem2.memory, Smem2.Size);
-
> вырезка кода client-а:
> WSocket.Listen;
Какой к лешему Listen у клиента ? Listen - метод, используемый сервером, а не клиентом.
-
> > вырезка кода client-а: > > > > WSocket.Listen; > > > Какой к лешему Listen у клиента ? > Listen - метод, используемый сервером, а не клиентом.
у компонента WSocket из ICS прием обратных пакетов осуществляется методом Listen. Если его убрать, то прием пакетов станет вообще невозможным. А как по другому?
-
> на порт и IP, полученный Server -ом
С этого момента подробнее ..
-
> > на порт и IP, полученный Server -ом > > > С этого момента подробнее ..
client отправляет Server-у пакет UDP Server получает вот так: WSocketUDP.ReceiveFrom(@buffer, sizeof(buffer), From, FromLen); используя данные во From, Server может отправлять сколько угодно UDP пакетов client -у На том компьютере, где запущен Server, запустим любую програмку, которая умеет отправлять UDP пакеты. Например UDP чат. В настройках для отправки пишем IP:Port, который был извлечен из From Server -ом. И пытаем отправить пакеты. Но эти пакеты не доходят до client -а. Хотя IP:Port - действующие, внешние. Почему так?
-
> Хотя IP:Port - действующие, внешние
Не факт. К тому же тобой никак не озвучена тема файрвола на машине, где работает программулина, на которую ты жалуешься что она не получает пакеты.
-
есть роутер d-link DSL-2440U К нему подключено 3 компа. На одном из компов стоит client. Как вы понимаете client находится за NAT
Server установлен на удаленном компе. К которому интернет заводится витой парой. Там тип соединения ISDN без авторизации. И в настройках сетевухи указаны IP, шлюз и DNS, который дал провайдер.
-
> client находится за NAT
И с какого же перепугу у клиента "IP:Port - действующие, внешние" ? У клиента IP-адрес вовсе не внешний, а внутренний.
Ты же наверняка не делал никаких телодвижений на d-link-роутере для конфигурирования вирт.сервера (aka "проброс порта"), настройки файрвола, организации DMZ и тд. и т.п
-
> Но если отправлять UDP пакеты с любой другой програмки (например, UDP чата) на порт и IP, полученный Server -ом, то client не получает эти пакеты. Почему? [0]
Ответ: > Как вы понимаете client находится за NAT [6]
Мантра: Я узнаю, что такое NAT и как это работает.
Ключ: Отвечать на сервере надо с того же сокета, которым принимаешь udp, тогда нат снатит, другая программа, шлющая пакеты, отвечает роутеру с другого сокета, и нат не понимает, кому эти udp предназначены.
-
> Отвечать на сервере надо с того же сокета, которым принимаешь > udp, тогда нат снатит
И то не факт.
Он "снатит" если:
1) NAT симметричного типа (в бюджетной фирмвари от d-link он никогда не присутствует)
2) Время отклика сервера превышает таймаут ожидания отклика в NAT-подсистеме роутера, отслеживающей исходящие UDP-соединения. У разных NAT CTS он обычно находится в диапазоне 1..3 мин.
-
> > > client находится за NAT > > > И с какого же перепугу у клиента "IP:Port - действующие, > внешние" ? > У клиента IP-адрес вовсе не внешний, а внутренний. > > Ты же наверняка не делал никаких телодвижений на d-link- > роутере для конфигурирования вирт.сервера (aka "проброс > порта"), настройки файрвола, организации DMZ и тд. и т.п
Ну как же он внутренний Ip у client ? Внутренний ip= 172.16.15.15 client отправляет UDP пакет на Server. И сервер извлекает из пакета внешний IP = 178.88.22.138
-
Ребята, подскажите мне, как сделать правильно? Чтобы client мог обходить nat
-
> И сервер извлекает из пакета внешний IP = 178.88.22.138
..и пытается отправить по этому адресу пакет, через хз сколько времени да еще поди с другого гнезда.
А у клиента-то адрес не 178.88.22.138, а 172.16.15.15 !
> Чтобы client мог обходить nat
см. [8] с учетом [9]
Либо задействовать посредника - stun-сервер.
-
> И сервер извлекает из пакета внешний IP = 178.88.22.138
Сервер извлекет, то что будет указано. UDP не так работает, как вам кажется.
-
Прочитал статью, но так и не понял, как мне организовать
связь client1, client2, client3 и т.д. с client_glavn
и как постоить STUN сервер. Назовем его Server. Он будет у нас находиться на постоянном статическом IP.
Дайте пожалуйста алгоритм. Так сказать для чайников
-
-
> xss22 (29.03.2012 10:16:14) [14]
Связь обеспечивают с client --> server и ни иначе, более того в отличии от TCP использовать вторично сокет не получится. Соединение в UDP не делается
-
> > xss22 (29.03.2012 10:16:14) [14] > > Связь обеспечивают с client --> server и ни иначе, более > того в отличии от > TCP использовать вторично сокет не получится. Соединение > в UDP не делается
Ну а как быть тогда? У нас есть Server. С ним клиенты связываются по TCP. Но также есть потребность, чтобы некоторые клиенты могли принимать UDP пакеты от других клиентов.
-
> Anatoly Podgoretsky © (29.03.12 10:29) [16] > в отличии от TCP использовать вторично сокет не получится.
почему? если клиент отправляет серверу ещё один пакет с тем же номером локального порта, что и предыдущий, сервер вышлет ему ответный пакет на этот же порт.
-
> RWolf © (29.03.12 10:50) [18]
Да но это другой сокет, а не тот который в соединение, о чем я и говорю. Есть два метода, когда адрес ответа передается в сообщение, например выше указаная технология STUN, и когда адрес и порт ответа содержатся с самом сокете. UDP позволяет указывать абсолютно любой адрес, не обязательно даже на компьютере с клиентом. Третья технология когда ни порт не передается, а используется по умолчанию, а адрес определяется из соединения.
|