Конференция "Сети" » 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 позволяет указывать абсолютно любой адрес, не обязательно даже на компьютере с клиентом. Третья технология когда ни порт не передается, а используется по умолчанию, а адрес определяется из соединения.
 
Конференция "Сети" » WSocket от overbyte.be и UDP [D7, WinXP]
Есть новые Нет новых   [134435   +18][b:0][p:0.001]