Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.06.2009, 21:58   #1
svchaos
 
Регистрация: 30.05.2009
Сообщений: 9
По умолчанию WinSock, UDP, широковещание; delphi (pascal)

Доброго времени суток всем!

Правда ли, что широковещание возможно лишь на компе, включенном в сеть? По крайней мере, на моем домашнем компе широковещающие программки не работают, в то время, как в сети университета все в порядке. Если это действительно так, то подскажите, пожалуйста, как такое можно обойти. Желательно, человеческим языком - мне еще далеко до профессионала.

Код:
program UdpSend;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Winsock;

var WSAData:TWSAData;
    val, adrlen, erc: integer;
    s: TSocket;
    buf: string;
    whoTo: TSockAddr;
begin
  WSAStartUp($0202,WSAData);
  s:=Socket(AF_Inet,Sock_DGRAM,0);
  val:=1;
  SetSockOpt(s,SOL_Socket,SO_Broadcast,pchar(@val),SizeOf(integer));
  WhoTo.sin_family:=PF_Inet;
  WhoTo.sin_port:=HToNS(11111);
  WhoTo.sin_addr.S_addr:=InAddr_Broadcast;
  FillChar(WhoTo.sin_zero,SizeOf(WhoTo.sin_zero),0);
  buf:='Kakaya-to stroka';
  adrlen:=SizeOf(TSockAddr);
  erc:=SendTo(s,buf[1],length(buf),0,WhoTo,adrlen);
  writeln('Sent symbols ',erc);
  writeln(WSAGetLastError);
  writeln('Sent: '+buf);
  readln;
  closeSocket(s);
  WSACleanUp;
end.
Код:
program UdpRecv;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Winsock;

var WSAData:TWSAData;
    adrlen,erc:integer;
    s:TSocket;
    buf:string;
    who,adr2:TSockAddr;
begin
  WSAStartUp($0202,WSAData);
  s:=Socket(AF_Inet,Sock_DGRAM,0);
  who.sin_family:=PF_Inet;
  who.sin_port:=HToNS(11111);
  who.sin_addr.S_addr:= INADDR_ANY;
  FillChar(who.sin_zero,SizeOf(who.sin_zero),0);
  erc:=bind(s,who,sizeOf(who));
  writeln('error ',erc);
  setlength(buf,1024);
  adrlen:=SizeOf(TSockAddr);
  erc:=recvFrom(s,buf[1],1024,0,adr2,adrlen);
  writeln('Received ',erc);
  writeln(WSAGetLastError);
  SetLength(buf, erc);
  writeln(buf);
  readln;
  closeSocket(s);
end.
Я задавал вопрос по данной тематике на студенческом разделе форума, но ответа не получил, поэтому счел необходимым задать его здесь.

Последний раз редактировалось svchaos; 01.06.2009 в 22:49. Причина: Лишняя фраза
svchaos вне форума Ответить с цитированием
Старый 01.06.2009, 22:21   #2
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Multicast пакеты, отправленные на бродкаст вашего интерфейса не замыкаются на вашем компьютере, а уйдут в сеть, соответственно они просто не пропускаются вашим провайдером, что совершенно нормально: мало кто из провайдеров пропускает Multicast трафик, так как для него надо отдельно создавать роутинг. В университете же у вас это работает потому что ваша сеть университета настроена на пропускание multicast-а.
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 01.06.2009, 22:47   #3
svchaos
 
Регистрация: 30.05.2009
Сообщений: 9
По умолчанию

То есть, получается, что на своем одиночном домашнем компе я программу с броадкастом ни запустить, ни, тем более, оттестировать нормально не могу? Или есть какие-то лазейки? Дома все-таки стены помогают.
svchaos вне форума Ответить с цитированием
Старый 02.06.2009, 08:22   #4
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

ну теоретически вы можете попробовать послать на бродкаст localhost-а
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Старый 02.06.2009, 14:36   #5
svchaos
 
Регистрация: 30.05.2009
Сообщений: 9
По умолчанию

Пробовал я на loopback вешать широковещание, да только толку не было.
Мне недавно сказали, что на адресе 127.0.0.1 оно вообще не работает. вы такую информацию подтверждаете?
svchaos вне форума Ответить с цитированием
Старый 02.06.2009, 14:44   #6
Квэнди
Старожил
 
Аватар для Квэнди
 
Регистрация: 13.12.2006
Сообщений: 3,859
По умолчанию

Дело в том что loopback 127.0.0.1 , который вешается на некий виртуальный интерфейс не имеет так какового адреса сети, соответственно multicast-а он неполучит, извините что раньше дезинформировал
ICQ не для вопросов, а для предложений. Для вопросов используйте форум
IRC канал клуба программистов|Мои статьи
Квэнди вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinSock, UDP, широковещание: Delphi (Pascal) svchaos Помощь студентам 8 01.06.2009 20:41
UDP и данные Shouldercannon Работа с сетью в Delphi 4 30.07.2008 09:12