Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > UDP протокол


Автор: Xsander 16.6.2006, 03:49
Всем доброго времени суток!!!

Столкнулся с такой проблемой, нужно переслать пакета данных на все ПК в сети по UDP протоколу.
В принципе, я ее решил вот таким образом:

Код

.................
uses
    WinSock;
.................

procedure SendUDP;
var
  Init    : TWSAData;
  Sock    : TSocket;
  SockOpt : BOOL;
  Target  : TSockAddrIn;
  Message : array [0..255] of Char;
  Tmp : String;
begin
  Tmp := 'Test';
  StrPCopy(Message, Tmp);
    begin
      WSAStartup($101,Init);
      Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
      SockOpt:=TRUE;
      SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST, PChar(@SockOpt),SizeOf(SockOpt)) ;
      Target.sin_port:=htons(5555);
      Target.sin_addr.S_addr:=INADDR_BROADCAST;
      Target.sa_family:=PF_INET;
      SendTo(Sock,Message,sizeof(Message),0,Target,SizeOf(Target));
      WSACleanup;
end;


Со стороны получателя, использую компоненты Indy UDP Server

Все это работает, но...
В сети существуют подсети, например, 10.9.5.1  и 10.3.2.1
Если посылать пакет с ПК находящегося в подсети 10.9.5.1, то этот пакет получают только  ПК из этой подсети, ну и аналогично для других подсетей.
Так вот суть вопроса, мне нужно посылать и получать пакеты во всех подсетях, как победить эту заразу???

Помогите, плиз. 

Автор: Snowy 16.6.2006, 10:08
Так уж устроен протокол UDP.
Он отправляет пакеты только в одну подсеть.
Чтобы отправлять в две подсети, нужно выполнять отправку 2 раза.
Чтобы указать, в какую подсеть отправлять, нужно привязать сокет к нужному сетевому адаптеру при помощи функции bind.
Без такой привязки винда сама будет выбирать в какую подсеть слать.
Что в твоём случае и происходит.

Добавлено @ 10:11 
ЗЫ. Если компьютер находится только в одной подсети, а слать нужно в разные,
то в сети должна быть настроена маршрутизация UDP между подсетями.
А у Вас похоже, маршрутизируется только TCP.

Добавлено @ 10:12 
Если настроить маршрутизацию нет возможности, то нужно, чтобы программа, установленная на компьютере с двумя интерфейсами, при получении пакетов, отсылала бы их копию в другую подсеть. 

Автор: Mechanic 16.6.2006, 10:37
Если на роутерах не фильтруются Broudcast пакеты тогда
     Должно работать
Иначе
     Не лечится. smile

Только multicast посылки.. 

Автор: Xsander 16.6.2006, 10:56
Цитата(Snowy @ 16.6.2006,  10:08)
Добавлено @ 10:12 
Если настроить маршрутизацию нет возможности, то нужно, чтобы программа, установленная на компьютере с двумя интерфейсами, при получении пакетов, отсылала бы их копию в другую подсеть.

Т.е. передавать пакет по цепочке, а если подсетей много? Как программа узнает, в какую именно подсеть отправить копию пакета.
Конечно, можно предусмотреть возможность отправки копий пакета во все подсети сразу и ждать ответа. 

Автор: Snowy 16.6.2006, 11:25
Если подсетей много, то нужно настраивать маршрутизацию UDP или отказываться от броадкаста. 

Автор: DCoder 17.6.2006, 08:22
У меня, кстати, тоже вопрос по Indy UDP. Почему по интернету пакеты не доходят, если даже я не пользуюсь броадкастом? 

Автор: Snowy 18.6.2006, 11:02
Маршрут не находят.
Некоторые провайдеры вообще не верят в существование UDP. Настраивают только TCP.
Хотя иногда есть и плюсы. Бывает, что UDP идёт, а провайдер его не считает...
Можно гигабайты прокачать по UDP - на стоимость это никак не падает. Халява. 

Автор: OvsInc 18.6.2006, 19:00
Цитата(Snowy @ 18.6.2006,  11:02)
Маршрут не находят.
Некоторые провайдеры вообще не верят в существование UDP. Настраивают только TCP.
Хотя иногда есть и плюсы. Бывает, что UDP идёт, а провайдер его не считает...
Можно гигабайты прокачать по UDP - на стоимость это никак не падает. Халява.

По-моему не в тему. Xsander говорит о локальной частной сети с двумя подетями. Связь между ними обеспечивает маршрутизатор. При чем тут провайдеры?
На маршритизаторе обязательно стоит брандмауэр (или прокси), а в его политика проста до безобразия (что не надо не пускать) и обусловлена потребностями сети (напимер, стандартный набор - FTP (21 TCP порт), WWW (80 TCP), NetBIOS (137 TCP UDP,138 TCP UDP,139 TCP UDP), DNS (55 UDP)). Так что выход - один использовать либо стандартный порт, либо договариваться с админом. 

Автор: Snowy 18.6.2006, 19:09
Цитата(OvsInc @  18.6.2006,  19:00 Найти цитируемый пост)
По-моему не в тему. Xsander говорит о локальной частной сети с двумя подетями.
Цитата(DCoder @  17.6.2006,  08:22 Найти цитируемый пост)
Почему по интернету пакеты не доходят, если даже я не пользуюсь броадкастом? 


Добавлено @ 19:10 
Просто это уже ответ на другой вопрос. 

Автор: Mechanic 18.6.2006, 19:32
Цитата(Snowy @  18.6.2006,  11:02 Найти цитируемый пост)
Маршрут не находят.
Некоторые провайдеры вообще не верят в существование UDP. Настраивают только TCP.
Хотя иногда есть и плюсы. Бывает, что UDP идёт, а провайдер его не считает...


В этом случае роутер ведь не делает разницы между TCP и UDP пакетами? Роутится ведь сам IP, независимо от того, что на него понавешано.  smile 
Почему же тогда под TCP маршруты находятся, но под UDP нет?
Конечно, имеется в виду ситуация, когда UDP-таки ходит. smile 

Автор: DCoder 19.6.2006, 07:59
Но, если я не ошибаюсь, интернет-радио работает на UDP. Как же в этом случае пакеты всегда "находят маршрут"? 

Автор: Mechanic 19.6.2006, 08:07
Цитата(DCoder @  19.6.2006,  07:59 Найти цитируемый пост)
Но, если я не ошибаюсь, интернет-радио работает на UDP

Ошибаешься. Оно работает на прямом TCP/IP туннеле.  smile  

Автор: DCoder 19.6.2006, 08:11
И что это значит?  smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)