Конференция "Сети" » WSocket от overbyte.be и UDP [D7, WinXP]
 
  • xss22 © (28.03.12 21:04) [0]
    Здравствуйте уважаемые!

    Предисловие.
    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);

  • Сергей М. © (28.03.12 21:46) [1]

    > вырезка кода client-а:


    > WSocket.Listen;


    Какой к лешему Listen у клиента ?
    Listen - метод, используемый сервером, а не клиентом.
  • xss22 © (28.03.12 21:49) [2]

    > > вырезка кода client-а:
    >
    >
    > > WSocket.Listen;
    >
    >
    > Какой к лешему Listen у клиента ?
    > Listen - метод, используемый сервером, а не клиентом.


    у компонента WSocket из ICS
    прием обратных пакетов осуществляется методом Listen.
    Если его убрать, то прием пакетов станет вообще невозможным.
    А как по другому?
  • Сергей М. © (28.03.12 22:20) [3]

    > на порт и IP, полученный  Server -ом


    С этого момента подробнее ..
  • xss22 © (28.03.12 22:35) [4]

    > > на порт и 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 - действующие, внешние.
    Почему так?
  • Сергей М. © (28.03.12 23:21) [5]

    > Хотя IP:Port - действующие, внешние


    Не факт.
    К тому же тобой никак не озвучена тема файрвола на машине, где работает программулина, на которую ты жалуешься что она не получает пакеты.
  • xss22 © (29.03.12 07:32) [6]
    есть роутер d-link DSL-2440U
    К нему подключено 3 компа.
    На одном из компов стоит client. Как вы понимаете client находится за NAT

    Server установлен на удаленном компе. К которому интернет заводится витой парой. Там тип соединения ISDN без авторизации. И в настройках сетевухи указаны IP, шлюз и DNS, который дал провайдер.
  • Сергей М. © (29.03.12 09:08) [7]

    > client находится за NAT


    И с какого же перепугу у клиента "IP:Port - действующие, внешние" ?
    У клиента IP-адрес вовсе не внешний, а внутренний.

    Ты же наверняка не делал никаких телодвижений на d-link-роутере для конфигурирования вирт.сервера (aka "проброс порта"), настройки файрвола, организации DMZ и тд. и т.п
  • megavoid © (29.03.12 09:09) [8]
    > Но если отправлять UDP пакеты с любой другой програмки (например, UDP чата) на порт и IP, полученный  Server -ом, то client не получает эти пакеты. Почему? [0]

    Ответ:
    > Как вы понимаете client находится за NAT [6]

    Мантра:
    Я узнаю, что такое NAT и как это работает.

    Ключ:
    Отвечать на сервере надо с того же сокета, которым принимаешь udp, тогда нат снатит, другая программа, шлющая пакеты, отвечает роутеру с другого сокета, и нат не понимает, кому эти udp предназначены.
  • Сергей М. © (29.03.12 09:31) [9]

    > Отвечать на сервере надо с того же сокета, которым принимаешь
    > udp, тогда нат снатит


    И то не факт.

    Он "снатит" если:

    1) NAT симметричного типа (в бюджетной фирмвари от d-link он никогда не присутствует)

    2) Время отклика сервера превышает таймаут ожидания отклика в NAT-подсистеме роутера, отслеживающей исходящие UDP-соединения. У разных NAT CTS он обычно находится в диапазоне 1..3 мин.
  • xss22 © (29.03.12 09:40) [10]

    >
    > > client находится за NAT
    >
    >
    > И с какого же перепугу у клиента "IP:Port - действующие,
    >  внешние" ?
    > У клиента IP-адрес вовсе не внешний, а внутренний.
    >
    > Ты же наверняка не делал никаких телодвижений на d-link-
    > роутере для конфигурирования вирт.сервера (aka "проброс
    > порта"), настройки файрвола, организации DMZ и тд. и т.п


    Ну как же он внутренний Ip у client ?
    Внутренний ip= 172.16.15.15
    client отправляет UDP пакет на Server.
    И сервер извлекает из пакета внешний IP = 178.88.22.138
  • xss22 © (29.03.12 09:42) [11]
    Ребята, подскажите мне, как сделать правильно?
    Чтобы client мог обходить nat
  • Сергей М. © (29.03.12 09:53) [12]

    > И сервер извлекает из пакета внешний IP = 178.88.22.138


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

    А у клиента-то адрес не 178.88.22.138, а 172.16.15.15 !


    > Чтобы client мог обходить nat


    см. [8] с учетом [9]

    Либо задействовать посредника - stun-сервер.
  • Anatoly Podgoretsky © (29.03.12 10:03) [13]

    > И сервер извлекает из пакета внешний IP = 178.88.22.138

    Сервер извлекет, то что будет указано. UDP не так работает, как вам кажется.
  • xss22 © (29.03.12 10:16) [14]
    Прочитал статью, но так и не понял, как мне организовать

    связь client1, client2, client3 и т.д. с client_glavn

    и как постоить STUN сервер. Назовем его Server. Он будет у нас находиться на постоянном статическом IP.

    Дайте пожалуйста алгоритм. Так сказать для чайников
  • xss22 © (29.03.12 10:17) [15]
  • Anatoly Podgoretsky © (29.03.12 10:29) [16]
    > xss22  (29.03.2012 10:16:14)  [14]

    Связь обеспечивают с client --> server и ни иначе, более того в отличии от
    TCP использовать вторично сокет не получится. Соединение в UDP не делается
  • xss22 © (29.03.12 10:35) [17]

    > > xss22  (29.03.2012 10:16:14)  [14]
    >
    > Связь обеспечивают с client --> server и ни иначе, более
    > того в отличии от
    > TCP использовать вторично сокет не получится. Соединение
    > в UDP не делается


    Ну а как быть тогда?
    У нас есть Server. С ним клиенты связываются по TCP.
    Но также есть потребность, чтобы некоторые клиенты могли принимать UDP пакеты от других клиентов.
  • RWolf © (29.03.12 10:50) [18]

    > Anatoly Podgoretsky ©   (29.03.12 10:29) [16]
    > в отличии от TCP использовать вторично сокет не получится.

    почему? если клиент отправляет серверу ещё один пакет с тем же номером локального порта, что и предыдущий, сервер вышлет ему ответный пакет на этот же порт.
  • Anatoly Podgoretsky © (29.03.12 11:02) [19]

    > RWolf ©   (29.03.12 10:50) [18]

    Да но это другой сокет, а не тот который в соединение, о чем я и говорю.
    Есть два метода, когда адрес ответа передается в сообщение, например выше указаная технология STUN, и когда адрес и порт ответа содержатся с самом сокете. UDP позволяет указывать абсолютно любой адрес, не обязательно даже на компьютере с клиентом. Третья технология когда ни порт не передается, а используется по умолчанию, а адрес определяется из соединения.
  • Anatoly Podgoretsky © (29.03.12 11:13) [20]
    > xss22  (29.03.2012 10:35:17)  [17]

    Не вижу ни каких проблем, если надо отвечать, то укажать с сокете куда, или
    указать в сообщение куда, или договориться об фиксированых портах и адресах.
    Сообщения принимает не клиет, а сервер.
  • Сергей М. © (29.03.12 11:13) [21]

    > есть потребность, чтобы некоторые клиенты могли принимать
    > UDP пакеты от других клиентов


    > как постоить STUN сервер


    Его не обязательно строить. Можно задействовать любой из публично доступных в Тырнете.
    А если приспичило построить его в рамках своего сервиса, то отправная точка - http://ru.wikipedia.org/wiki/STUN
  • Anatoly Podgoretsky © (29.03.12 11:17) [22]
    Сокет умирает сразу после передачи! Ответить на тот же сокет не возможно.
    Но никто не мешает запусить UDP Server, котрый известен одним из трех указаных способов, и принимать на нем сообщения. А на серверной стороне клиент.
  • xss22 © (29.03.12 12:32) [23]
    исходя из статьи:
    http://www.cyberguru.ru/networks/network-security/nat-details-page2.html

    Та адреса сервера STUN – 11.22.33.1 и 11.22.33.2
    Это получается нужно 2 разных машины?
    На одном компе можно сделать? и в рамках одной программы
  • Сергей М. © (29.03.12 12:44) [24]

    > Это получается нужно 2 разных машины?


    Не получается.
    Достаточно одной, но с двумя внешними стат.адресами.


    > На одном компе можно сделать? и в рамках одной программы


    Можно, см. выше.

    Зачем тебе выеживаться со своим stun'ом, если провайдер выделил тебе один адрес и платить за второй нет желания ?
    Воспользуйся существующими публичными stun-сервисами.
  • xss22 © (29.03.12 17:49) [25]
    А как можно обойти симметричный тип NAt ?
  • Сергей М. © (29.03.12 20:30) [26]
    ты со своим коническим сначала разберись)
  • xss22 © (29.03.12 20:36) [27]
    так в том то и дело, что у меня симметричный NAT. Отсюда то и все беды!
    и как его можно обойти?
  • Сергей М. © (29.03.12 22:11) [28]

    > у меня симметричный NAT


    с чего такая уверенность ?

    http://ilya-314.livejournal.com/109479.html
  • xss22 © (30.03.12 07:39) [29]

    >
    > > у меня симметричный NAT
    >
    >
    > с чего такая уверенность ?
    >
    > http://ilya-314.livejournal.com/109479.html


    Программулиной проверял
    http://www.fayloobmennik.net/1728195
  • Сергей М. © (30.03.12 10:16) [30]
    ну если верить этой программулине, то stun тебя не спасет.
  • xss22 © (30.03.12 11:26) [31]

    > ну если верить этой программулине, то stun тебя не спасет.


    да уже понял, что STUN не может обойти симметричный NAT. Какой еще есть выход?
  • xss22 © (30.03.12 11:49) [32]
    Симметричный NAT - наиболее распространенный NAT.
    И как же его обходить?
  • Anatoly Podgoretsky © (30.03.12 11:54) [33]
    > xss22  (30.03.2012 11:49:32)  [32]

    За всю жизнь не сталкивался и не использовал, так что слухи о
    распространение очень сильно преувеличены.
  • Сергей М. © (30.03.12 11:58) [34]
    А никак.

    Только через сервер-посредник.
    В противном случае проблема решается только конфигурированием роутера - DMZ, виртуализация сервиса (aka проброс порта), UPnp
  • Сергей М. © (30.03.12 11:58) [35]

    > слухи о распространение очень сильно преувеличены


    Эт точно.
  • xss22 © (30.03.12 12:12) [36]
    Программулиной проверял
    http://www.fayloobmennik.net/1728195

    вот она мне и дала этот результат.
    Может она меня обманывает???
  • Сергей М. © (30.03.12 12:28) [37]
    Проверить-то недолго)

    Посылаешь сообщение своему серверу от клиента A (который за НАТом), сервер тебе показывает адресA:портA отправителя.

    Тут же быстренько в темпе ошпаренного кота:

    - посылаешь сообщение от клиента B (адресB:портB) клиенту A (адресA:портA).
    Если сообщение дошло, то это конусный НАТ.

    - посылаешь сообщение от клиента B (адресB:портA) клиенту A (адресA:портA).
    Если сообщение дошло, то это порт-рестриктед НАТ.

    Иначе это симметричный НАТ.

    Иначе
  • xss22 © (31.03.12 09:02) [38]
    А где можно найти готовый компонент DELPHI, работающего со STUN серверами?
  • Сергей М. © (31.03.12 18:38) [39]
    самому состряпать-то не судьба ?
    протокол ведь примитивный ..
  • xss22 © (31.03.12 22:04) [40]

    > Сергей М. ©   (31.03.12 18:38) [39]
    >
    > самому состряпать-то не судьба ?
    > протокол ведь примитивный ..
    >


    Думаю ты прав!
  • Nick N. © (25.06.12 01:04) [41]

    > Посылаешь сообщение своему серверу от клиента A (который
    > за НАТом), сервер тебе показывает адресA:портA отправителя.
    > Тут же быстренько в темпе ошпаренного кота:
    > - посылаешь сообщение от клиента B (адресB:портB) клиенту
    > A (адресA:портA).
    > Если сообщение дошло, то это конусный НАТ.


    Можно подробней по реализации? Целый день бился, ничего не работает.
    У меня как оказалось Port-Restricted Cone NAT (Zyxel Keenetic)

    Сделал следующее:
    1. На роутере пробросил порт 5210 на компьютер
    2. В приложении создал IDUDPServer на 5210 порт.
    3. Положил два UDP клиента, задал порты исходящие 5211, 5212.
    4. Подключаюсь к UDP серверу через Роутер, 192.168.1.1:5210
    5. С каждого клиента отправляю текст '1' и '2' на сервер для определения реальных IP адресов (получаю например 192.168.1.1:4440 и 192.168.1.1:4441)
    6. Кладу еще 2 UDP сервера, каждый слушает под клиентом, 5211 и 5212
    7. Пытаюсь отправить пакет с Клиента1 на Клиент2 и наоборот
    8. Сервера, которые слушают под клиентами не получают пакетов, NAT не пробит? Почему?

    Помогите пожалуйста разобраться, сил уже нет

    P.S. Если Клиент1 отправляет пакет не на IP роутера, а на IP самой машины (и порт 5211 или 5212), то все работает. Соответственно пакеты рубятся на роутере. Или ... ?
  • Anatoly Podgoretsky © (25.06.12 06:44) [42]
    Зачем НАТ в локалке (4).
    Порт на файрволе рутера разрешен?
    Что показывает нетстат? на данном интерфейсе рутера, на машине приемника?
  • Anatoly Podgoretsky © (25.06.12 06:48) [43]
    Удалено модератором
  • Nick N. © (25.06.12 13:16) [44]

    > Зачем НАТ в локалке (4).


    Скорее всего из-за этого проблема, что оба пира находятся в одной сети. Проверю на разных сетях потом буду задавать вопросы.

    Спасибо за ответ, натолкнул на мысль
 
Конференция "Сети" » WSocket от overbyte.be и UDP [D7, WinXP]
Есть новые Нет новых   [134435   +14][b:0][p:0.001]