Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];

Вниз

Широковещательный 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.006 c
2-1245399017
Б
2009-06-19 12:10
2009.08.16
Скорость алгоритма.


2-1245663388
OlegNik
2009-06-22 13:36
2009.08.16
Имя файла но короче.


11-1205331153
DJ_UZer
2008-03-12 17:12
2009.08.16
По ссылке


15-1245181636
man from earth
2009-06-16 23:47
2009.08.16
а я например верю в лунатиков и в теории заговоров


2-1245219624
b/@.
2009-06-17 10:20
2009.08.16
Странный зависон приложения :(





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский