Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

Широковещательный UDP запрос   Найти похожие ветки 

 
Михаил (Питер)   (2008-03-07 10:25) [0]

Есть два приложения, одно клиент, другое сервер. Клиент посылает широковещательный UDP запрос с помощью IdUDPClient. Если оба приложения расположены на одном компьютере, то всё нормально и запрос сервером нормально принимается и обрабатывается. Но вот, если на разных, запрос уходит, но сервером не воспринимается. Я знаю, что коммутатор может не пропускать такие запросы, поэтому компьютеры соединил прямым кроссовым кабелем. Фаерволов на компьютерах не установлено (Правда на одном стоит Каспер. Может в этом дело? Мой препод говорит, что врядли это из-за антивируса). В чём может быть проблема? Помогите, Мастера


 
Сергей М. ©   (2008-03-07 10:36) [1]


> знаю, что коммутатор может не пропускать такие запросы


Коммутатору-то как раз глубоко фиолетово содержимое сетевых пакетов, так что эксперимент с прямым соединением был лишним.

Если ошибок в программе нет (что вряд ли), то дело, скорей всего, в ненастроенной или неверно настроенной маршрутизации.

По поводу ошибок - уточни к каким сетевым интерфейсам биндятся твои сервер и клиент ..


 
medved_68   (2008-03-07 10:38) [2]


> Я знаю, что коммутатор может не пропускать такие запросы,
>  поэтому компьютеры соединил прямым кроссовым кабелем.

И при этом расшаренные на одном компе папки видны на другом, и можно обмениваться файлами?

> Фаерволов на компьютерах не установлено

Брандмауэр включен? И если да - то в исключениях стоит Борланд сокеты?


 
Сергей М. ©   (2008-03-07 10:41) [3]


> в исключениях стоит Борланд сокеты?


Какие такие "Борланд сокеты" ?

Брандмауер знать не знает и знать не обязан ни про какой борланд с его сокетами.


 
medved_68 ©   (2008-03-07 10:49) [4]


> Какие такие "Борланд сокеты" ?

Borland Socket Server :))
> Брандмауер знать не знает и знать не обязан ни про какой
> борланд с его сокетами.

Знать то он не обязан, а вот блокировать..... :)


 
Сергей М. ©   (2008-03-07 10:52) [5]


> Borland Socket Server


А он-то тут причем ?


 
medved_68 ©   (2008-03-07 11:01) [6]


> А он-то тут причем ?


> Но вот, если на разных, запрос уходит, но сервером не воспринимается.
Я так понял, что переносит исполняемый файл допустим сервера, на другую машину (к примеру на ней нет предустановленной Дельфи и в исключениях брандмауэра нет этого пункта, опять телепатия :) ). Тогда при запуске приложения (если не включена опция предупреждения о блокировке (или вырублено, чтобы не раздражало :) ) будет просто заблокировано без всяких уведомлений. :) Но мне все таки подозрительно:
> поэтому компьютеры соединил прямым кроссовым кабелем
Сергей, заметь, не оверкроссовым, а прямым..... :))


 
Сергей М. ©   (2008-03-07 11:10) [7]


> переносит исполняемый файл допустим сервера, на другую машину


Ну переносит. Но BSS-то причем ? Его приложение не имеет ничего общего с приложением BSS.


> не оверкроссовым, а прямым


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

У меня пока устойчивое подозрение на программные ошибки - приемник бродкастов не привязан тому интерфейсу, через который поступают бродкасты.


 
medved_68 ©   (2008-03-07 11:19) [8]


> Но BSS-то причем ? Его приложение не имеет ничего общего
> с приложением BSS.


> с помощью IdUDPClient.

Хм....у меня при снятии галки с BSS блокирует что TServer/ClientSocket, что Indy......посему на это и подумалось навскидку. :)

> У меня пока устойчивое подозрение на программные ошибки
> - приемник бродкастов не привязан тому интерфейсу, через
> который поступают бродкасты.

Возможно, даже очень, но:
> Если оба приложения расположены на одном компьютере, то
> всё нормально и запрос сервером нормально принимается и
> обрабатывается.
просто хотелось выяснить:
> Я знаю, что коммутатор может не пропускать такие запросы,
>  поэтому компьютеры соединил прямым кроссовым кабелем. Фаерволов
> на компьютерах не установлено (Правда на одном стоит Каспер.
>  Может в этом дело? Мой препод говорит, что врядли это из-
> за антивируса).

а сеть то между двумя компами вообще  функционирует? И если да - то тогда уже копать программу. :)


 
Сергей М. ©   (2008-03-07 11:47) [9]

Осталось выслушать самого начальника транспортного цеха)


 
Михаил (Питер)   (2008-03-07 18:13) [10]

Брандмауэр выключен как служба (т.е. вообще эта служба не запускается). Кабель, конечно, оверкросовый. Сначалдо пробовал через коммутатор - та же история. Ща выложу часть кода программы, но я вроде всё делала в соответствии с учебником, поэтому, сомневаюсь, что есть программные ошибки, так как там ничего сверхсложного нет. Думаю, что всё-таки что-то с настройками системы

Вот код сервера:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, IdSocketHandle, StdCtrls,
 ExtCtrls, Buttons;

type
 TSetup = record
   Mask: String;
   Punkt: Integer;
 end;
 TAct = record
   Head: String;
   Buffer: Boolean;
   Msg: String;
 end;
 TParam = record
   IP: String;
   MAC: String;
 end;
 TServ = record
   Position: integer;
   Act: TAct;
   Setup: TSetup;
   Param: TParam;
 end;

type
 TForm1 = class(TForm)
   IdUDPServer1: TIdUDPServer;
   Memo1: TMemo;
   Timer1: TTimer;
   BitBtn1: TBitBtn;
   RadioGroup1: TRadioGroup;
   procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
     ABinding: TIdSocketHandle);
   procedure BitBtn1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure RadioGroup1Click(Sender: TObject);
   procedure IdUDPServer1Status(ASender: TObject;
     const AStatus: TIdStatus; const AStatusText: String);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 serv: TServ;

implementation

{$R *.dfm}

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
 ABinding: TIdSocketHandle);
var LMsg: String;
begin
 If AData.Size<>0 then
   begin
     SetLength(LMsg,AData.Size);
     AData.ReadBuffer(LMsg[1],Length(LMsg));
     serv.Act.Msg:=LMsg;
     serv.Act.Buffer:=true;
//      Memo1.Lines.Add(LMsg);
   end;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 serv.Position:=1;
 Timer1.Enabled:=True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i,Count: Integer;
   StrP,TIp,TMac: String;
   fIn: TextFile;
   flag: Boolean;
begin
 Case serv.Position of
   1:begin
       IdUDPServer1.Active:=true;
       Memo1.Lines.Add("&#207;&#229;&#240;&#229;&#226;&#238;&#228; &#241;&#229;&#242;&#229;&#226;&#238;&#227;&#238; &#224;&#228;&#224;&#239;&#242;&#229;&#240;&#224; &#226; &#240;&#229;&#230;&#232;&#236; &#239;&#229;&#240;&#229;&#245;&#226;&#224;&#242;&#224;");
     end;
   4:begin
       IdUDPServer1.Active:=true;
       Memo1.Lines.Add("&#205;&#224;&#241;&#242;&#240;&#238;&#233;&#234;&#224; &#244;&#232;&#235;&#252;&#242;&#240;&#224; &#237;&#224; &#239;&#240;&#232;&#184;&#236; &#242;&#238;&#235;&#252;&#234;&#238; ARP &#239;&#224;&#234;&#229;&#242;&#238;&#226;");
       serv.Setup.Mask:="ARP";
       serv.Act.Head:=serv.Setup.Mask;
       serv.Setup.Punkt:=0;
     end;
   5:begin
       if serv.Setup.Punkt=0 then begin Memo1.Lines.Add(""); serv.Setup.Punkt:=3; end;
       StrP:="";
       for i:=1 to serv.Setup.Punkt do StrP:=StrP+".";
       if serv.Setup.Punkt=5 then serv.Setup.Punkt:=0;
       inc(serv.Setup.Punkt);
       Memo1.Lines[Memo1.Lines.Count-1]:="&#207;&#240;&#232;&#184;&#236; ARP &#239;&#224;&#234;&#229;&#242;a"+StrP;
//        Memo1.Lines.Add("&#207;&#240;&#232;&#184;&#236; ARP &#239;&#224;&#234;&#229;&#242;a...");
       if serv.Act.Buffer then
         begin
           serv.Act.Buffer:=false;
           if Copy(serv.Act.Msg,1,3)="ARP"
             then begin Delete(serv.Act.Msg,1,3); Memo1.Lines.Add("&#207;&#238;&#235;&#243;&#247;&#229;&#237; ARP &#239;&#224;&#234;&#229;&#242;") end
             else dec(serv.Position);
         end
        else
         dec(serv.Position);
     end;
   6:begin
       Memo1.Lines.Add("&#200;&#231;&#226;&#235;&#229;&#247;&#229;&#237;&#232;&#229; MAC &#232; IP &#224;&#228;&#240;&#229;&#241;&#238;&#226;");
       Count:=0;
       for i:=1 to Length(serv.Act.Msg) do
         if serv.Act.Msg[i]=":" then Count:=i;
       serv.Param.IP:=Copy(serv.Act.Msg,1,count-1);
       serv.Param.MAC:=Copy(serv.Act.Msg,count+1,Length(serv.Act.Msg)-count);
     end;
   7:begin
       Memo1.Lines.Add("&#207;&#240;&#238;&#226;&#229;&#240;&#234;&#224; &#241;&#238;&#238;&#242;&#226;&#229;&#242;&#241;&#242;&#226;&#232;&#255; MAC &#232; IP &#224;&#240;&#229;&#241;&#238;&#226; &#239;&#238; &#232;&#241;&#242;&#232;&#237;&#237;&#238;&#233; &#225;&#224;&#231;&#229; &#228;&#224;&#237;&#237;&#251;&#245;");
       AssignFile(fIn,"IPMAC.bas");
       Reset(fIn);
       flag:=false;
       while not EoF(fIn) do
         begin
           readln(fIn,TMac);
           readln(fIn,TIp);
           flag:=(TMac=serv.Param.MAC)and(TIp=serv.Param.IP) or flag;
         end;
       CloseFile(fIn);
       if flag
         then Memo1.Lines.Add("IP &#232; MAC &#224;&#228;&#240;&#229;&#241;&#224; &#241;&#238;&#238;&#242;&#226;&#229;&#242;&#241;&#242;&#226;&#243;&#254;&#242; &#228;&#240;&#243;&#227; &#228;&#240;&#243;&#227;&#243; => &#224;&#242;&#224;&#234;&#224; &#237;&#229; &#238;&#225;&#237;&#224;&#240;&#243;&#230;&#229;&#237;&#224;")
         else Memo1.Lines.Add("&#206;&#225;&#237;&#224;&#240;&#243;&#230;&#229;&#237;&#224; &#224;&#242;&#224;&#234;&#224;!!! &#203;&#238;&#230;&#237;&#251;&#233; IP:""+serv.Param.IP+"", &#235;&#238;&#230;&#237;&#251;&#233; MAC:""+serv.Param.MAC+""");
     end;
   8:begin
       idUDPServer1.Active:=false;
     end;
 end;
 inc(serv.Position);
 if serv.Position=20 then
   begin
     Timer1.Enabled:=false;
     serv.Position:=0;
     exit;
   end;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
 If RadioGroup1.ItemIndex=0 then Timer1.Interval:=200 else Timer1.Interval:=2000;
end;

procedure TForm1.IdUDPServer1Status(ASender: TObject;
 const AStatus: TIdStatus; const AStatusText: String);
begin

end;

end.

порт установлен 9898 в настройках самого сервера


 
Михаил (Питер)   (2008-03-07 18:13) [11]

Вот клиент:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Buttons, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase,
 IdUDPClient, ExtCtrls;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   Label2: TLabel;
   SpeedButton1: TSpeedButton;
   MAC1: TEdit;
   IdUDPClient1: TIdUDPClient;
   IP1: TEdit;
   IP2: TEdit;
   IP3: TEdit;
   IP4: TEdit;
   Label1: TLabel;
   MAC2: TEdit;
   MAC3: TEdit;
   MAC4: TEdit;
   MAC5: TEdit;
   MAC6: TEdit;
   Label3: TLabel;
   Label4: TLabel;
   Label5: TLabel;
   Label6: TLabel;
   Label7: TLabel;
   Label8: TLabel;
   Label9: TLabel;
   Label10: TLabel;
   procedure SpeedButton1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 IP,MAC: String;

implementation

{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
var str: String;
begin
 str:=IP1.Text;
 If (StrToInt(str)>255)or(StrToInt(str)<0) then
   begin
     Application.MessageBox("IP &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 IP:=str;
 str:=IP2.Text;
 If (StrToInt(str)>255)or(StrToInt(str)<0) then
   begin
     Application.MessageBox("IP &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 IP:=IP+"."+str;
 str:=IP3.Text;
 If (StrToInt(str)>255)or(StrToInt(str)<0) then
   begin
     Application.MessageBox("IP &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 IP:=IP+"."+str;
 str:=IP4.Text;
 If (StrToInt(str)>255)or(StrToInt(str)<0) then
   begin
     Application.MessageBox("IP &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 IP:=IP+"."+str;

 str:=MAC1.Text;
 If str="" then
   begin
     Application.MessageBox("MAC &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 MAC:=str;
 str:=MAC2.Text;
 If str="" then
   begin
     Application.MessageBox("MAC &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 MAC:=MAC+"-"+str;
 str:=MAC3.Text;
 If str="" then
   begin
     Application.MessageBox("MAC &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 MAC:=MAC+"-"+str;
 str:=MAC4.Text;
 If str="" then
   begin
     Application.MessageBox("MAC &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 MAC:=MAC+"-"+str;
 str:=MAC5.Text;
 If str="" then
   begin
     Application.MessageBox("MAC &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 MAC:=MAC+"-"+str;
 str:=MAC6.Text;
 If str="" then
   begin
     Application.MessageBox("MAC &#224;&#228;&#240;&#229;&#241;&#241; &#226;&#226;&#229;&#228;&#184;&#237; &#237;&#229;&#239;&#240;&#224;&#226;&#232;&#235;&#252;&#237;&#238;","&#206;&#248 ;&#232;&#225;&#234;&#224;",MB_ICONERROR);
     exit;
   end;
 MAC:=MAC+"-"+str;

 IdUDPClient1.Send("ARP"+IP+":"+MAC);
end;

end.

порт тоже в настройках стоит 9898, а свойство Active сразу в True, свойство BroadcastEnabled тоже в True


 
Сергей М. ©   (2008-03-07 20:59) [12]

Ну и зачем ты эту кучу говна вывалил сюда ?)

От тебя и требовалось всего-то - изложить свои соображения насчет привязки твоего клиента и/или сервера к сетевым интерфейсам.

Только не говори, что ни ты ни препод не знаете что это за звери)


 
DiamondShark ©   (2008-03-10 13:55) [13]

Что-то я не вижу здесь "Клиент посылает широковещательный UDP запрос с помощью IdUDPClient".

Единственная содержательная строчка "IdUDPClient1.Send("ARP"+IP+":"+MAC);" никакого такого широковещательного запроса не посылает.


 
medved_68 ©   (2008-03-11 09:02) [14]


> Единственная содержательная строчка "IdUDPClient1.Send("ARP"+IP+":
> "+MAC);" никакого такого широковещательного запроса не посылает.
>

:))) Автор думает иначе.
IdUDPClient1.Broadcast("Hello",10000);???


 
Михаил (Питер)   (2008-03-11 12:30) [15]

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


 
Сергей М. ©   (2008-03-11 13:37) [16]


> Михаил (Питер)   (11.03.08 12:30) [15]


Ты вообще какую версию Инди мучаешь ?
Если 9-ку, то книгу эту, если она именно про 9-ку, выкинь в корзину.


 
Михаил (Питер)   (2008-03-11 13:52) [17]

а почему тогда на одном компьютере два приложения нормально функционируют через такие как у меня "широковещательные" запросы?


 
Сергей М. ©   (2008-03-11 14:13) [18]

Потому что

ShowMessage(GStack.ResolveHost(idudpclient1.Host));


 
Михаил (Питер)   (2008-03-17 17:50) [19]

Блин, в натуре так и есть ) Спасибо большое



Страницы: 1 вся ветка

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.017 c
2-1245426913
Alexander3
2009-06-19 19:55
2009.08.16
Структура в Dll


4-1214295759
Sashahttp
2008-06-24 12:22
2009.08.16
Определить "Код экземпляра устройства" (CD-ROM)


2-1245167149
worldmen
2009-06-16 19:45
2009.08.16
Бастро посчитать в TEdit сумму


2-1245146560
Polkin
2009-06-16 14:02
2009.08.16
Assigned к объекту своего класса...


15-1244611324
pasha_golub
2009-06-10 09:22
2009.08.16
Не пойму сути компонентов а-ля TTransaction