Конференция "Сети" » Широковещательный UDP запрос [D7, WinXP]
 
  • Михаил (Питер) (07.03.08 10:25) [0]
    Есть два приложения, одно клиент, другое сервер. Клиент посылает широковещательный UDP запрос с помощью IdUDPClient. Если оба приложения расположены на одном компьютере, то всё нормально и запрос сервером нормально принимается и обрабатывается. Но вот, если на разных, запрос уходит, но сервером не воспринимается. Я знаю, что коммутатор может не пропускать такие запросы, поэтому компьютеры соединил прямым кроссовым кабелем. Фаерволов на компьютерах не установлено (Правда на одном стоит Каспер. Может в этом дело? Мой препод говорит, что врядли это из-за антивируса). В чём может быть проблема? Помогите, Мастера
  • Сергей М. © (07.03.08 10:36) [1]

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


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

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

    По поводу ошибок - уточни к каким сетевым интерфейсам биндятся твои сервер и клиент ..
  • medved_68 (07.03.08 10:38) [2]

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

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

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

    Брандмауэр включен? И если да - то в исключениях стоит Борланд сокеты?
  • Сергей М. © (07.03.08 10:41) [3]

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


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

    Брандмауер знать не знает и знать не обязан ни про какой борланд с его сокетами.
  • medved_68 © (07.03.08 10:49) [4]

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

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

    Знать то он не обязан, а вот блокировать..... :)
  • Сергей М. © (07.03.08 10:52) [5]

    > Borland Socket Server


    А он-то тут причем ?
  • medved_68 © (07.03.08 11:01) [6]

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


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

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


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


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


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

    У меня пока устойчивое подозрение на программные ошибки - приемник бродкастов не привязан тому интерфейсу, через который поступают бродкасты.
  • medved_68 © (07.03.08 11:19) [8]

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


    > с помощью IdUDPClient.

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

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

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

    а сеть то между двумя компами вообще  функционирует? И если да - то тогда уже копать программу. :)
  • Сергей М. © (07.03.08 11:47) [9]
    Осталось выслушать самого начальника транспортного цеха)
  • Михаил (Питер) (07.03.08 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('Ïåðåâîä ñåòåâîãî àäàïòåðà â ðåæèì ïåðåõâàòà');
         end;
       4:begin
           IdUDPServer1.Active:=true;
           Memo1.Lines.Add('Íàñòðîéêà ôèëüòðà íà ïðè¸ì òîëüêî ARP ïàêåòîâ');
           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]:='Ïðè¸ì ARP ïàêåòa'+StrP;
    //        Memo1.Lines.Add('Ïðè¸ì ARP ïàêåò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('Ïîëó÷åí ARP ïàêåò') end
                 else dec(serv.Position);
             end
            else
             dec(serv.Position);
         end;
       6:begin
           Memo1.Lines.Add('Èçâëå÷åíèå MAC è IP àäðåñîâ');
           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('Ïðîâåðêà ñîîòâåòñòâèÿ MAC è IP àðåñîâ ïî èñòèííîé áàçå äàííûõ');
           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 è MAC àäðåñà ñîîòâåòñòâóþò äðóã äðóãó => àòàêà íå îáíàðóæåíà')
             else Memo1.Lines.Add('Îáíàðóæåíà àòàêà!!! Ëîæíûé IP:"'+serv.Param.IP+'", ëîæíûé 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 в настройках самого сервера
  • Михаил (Питер) (07.03.08 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 àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     IP:=str;
     str:=IP2.Text;
     If (StrToInt(str)>255)or(StrToInt(str)<0) then
       begin
         Application.MessageBox('IP àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     IP:=IP+'.'+str;
     str:=IP3.Text;
     If (StrToInt(str)>255)or(StrToInt(str)<0) then
       begin
         Application.MessageBox('IP àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     IP:=IP+'.'+str;
     str:=IP4.Text;
     If (StrToInt(str)>255)or(StrToInt(str)<0) then
       begin
         Application.MessageBox('IP àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     IP:=IP+'.'+str;

     str:=MAC1.Text;
     If str='' then
       begin
         Application.MessageBox('MAC àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     MAC:=str;
     str:=MAC2.Text;
     If str='' then
       begin
         Application.MessageBox('MAC àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     MAC:=MAC+'-'+str;
     str:=MAC3.Text;
     If str='' then
       begin
         Application.MessageBox('MAC àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     MAC:=MAC+'-'+str;
     str:=MAC4.Text;
     If str='' then
       begin
         Application.MessageBox('MAC àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     MAC:=MAC+'-'+str;
     str:=MAC5.Text;
     If str='' then
       begin
         Application.MessageBox('MAC àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     MAC:=MAC+'-'+str;
     str:=MAC6.Text;
     If str='' then
       begin
         Application.MessageBox('MAC àäðåññ ââåä¸í íåïðàâèëüíî','Îø ;èáêà',MB_ICONERROR);
         exit;
       end;
     MAC:=MAC+'-'+str;

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

    end.

    порт тоже в настройках стоит 9898, а свойство Active сразу в True, свойство BroadcastEnabled тоже в True
  • Сергей М. © (07.03.08 20:59) [12]
    Ну и зачем ты эту кучу говна вывалил сюда ?)

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

    Только не говори, что ни ты ни препод не знаете что это за звери)
  • DiamondShark © (10.03.08 13:55) [13]
    Что-то я не вижу здесь "Клиент посылает широковещательный UDP запрос с помощью IdUDPClient".

    Единственная содержательная строчка "IdUDPClient1.Send('ARP'+IP+':'+MAC);" никакого такого широковещательного запроса не посылает.
  • medved_68 © (11.03.08 09:02) [14]

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

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

    ???
  • Михаил (Питер) (11.03.08 12:30) [15]
    В книге было написано, что если поле с местом назначения запроса не указано, то запрос будет широковещательным..
  • Сергей М. © (11.03.08 13:37) [16]

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


    Ты вообще какую версию Инди мучаешь ?
    Если 9-ку, то книгу эту, если она именно про 9-ку, выкинь в корзину.
  • Михаил (Питер) (11.03.08 13:52) [17]
    а почему тогда на одном компьютере два приложения нормально функционируют через такие как у меня "широковещательные" запросы?
  • Сергей М. © (11.03.08 14:13) [18]
    Потому что

    ShowMessage(GStack.ResolveHost(idudpclient1.Host));
  • Михаил (Питер) (17.03.08 17:50) [19]
    Блин, в натуре так и есть ) Спасибо большое
 
Конференция "Сети" » Широковещательный UDP запрос [D7, WinXP]
Есть новые Нет новых   [134431   +15][b:0][p:0.001]