-
Есть два приложения, одно клиент, другое сервер. Клиент посылает широковещательный UDP запрос с помощью IdUDPClient. Если оба приложения расположены на одном компьютере, то всё нормально и запрос сервером нормально принимается и обрабатывается. Но вот, если на разных, запрос уходит, но сервером не воспринимается. Я знаю, что коммутатор может не пропускать такие запросы, поэтому компьютеры соединил прямым кроссовым кабелем. Фаерволов на компьютерах не установлено (Правда на одном стоит Каспер. Может в этом дело? Мой препод говорит, что врядли это из-за антивируса). В чём может быть проблема? Помогите, Мастера
-
> знаю, что коммутатор может не пропускать такие запросы
Коммутатору-то как раз глубоко фиолетово содержимое сетевых пакетов, так что эксперимент с прямым соединением был лишним.
Если ошибок в программе нет (что вряд ли), то дело, скорей всего, в ненастроенной или неверно настроенной маршрутизации.
По поводу ошибок - уточни к каким сетевым интерфейсам биндятся твои сервер и клиент ..
-
> Я знаю, что коммутатор может не пропускать такие запросы, > поэтому компьютеры соединил прямым кроссовым кабелем.
И при этом расшаренные на одном компе папки видны на другом, и можно обмениваться файлами?
> Фаерволов на компьютерах не установлено
Брандмауэр включен? И если да - то в исключениях стоит Борланд сокеты?
-
> в исключениях стоит Борланд сокеты?
Какие такие "Борланд сокеты" ?
Брандмауер знать не знает и знать не обязан ни про какой борланд с его сокетами.
-
> Какие такие "Борланд сокеты" ?
Borland Socket Server :)) > Брандмауер знать не знает и знать не обязан ни про какой > борланд с его сокетами.
Знать то он не обязан, а вот блокировать..... :)
-
> Borland Socket Server
А он-то тут причем ?
-
> А он-то тут причем ?
> Но вот, если на разных, запрос уходит, но сервером не воспринимается. Я так понял, что переносит исполняемый файл допустим сервера, на другую машину (к примеру на ней нет предустановленной Дельфи и в исключениях брандмауэра нет этого пункта, опять телепатия :) ). Тогда при запуске приложения (если не включена опция предупреждения о блокировке (или вырублено, чтобы не раздражало :) ) будет просто заблокировано без всяких уведомлений. :) Но мне все таки подозрительно: > поэтому компьютеры соединил прямым кроссовым кабелем Сергей, заметь, не оверкроссовым, а прямым..... :))
-
> переносит исполняемый файл допустим сервера, на другую машину
Ну переносит. Но BSS-то причем ? Его приложение не имеет ничего общего с приложением BSS.
> не оверкроссовым, а прямым
Под прямым, скорей всего, имелось ввиду соединение напрямую, а не через хаб. Ессно разводка кабеля при этом д.б. кроссовой, а не прямой.
У меня пока устойчивое подозрение на программные ошибки - приемник бродкастов не привязан тому интерфейсу, через который поступают бродкасты.
-
> Но BSS-то причем ? Его приложение не имеет ничего общего > с приложением BSS.
> с помощью IdUDPClient.
Хм....у меня при снятии галки с BSS блокирует что TServer/ClientSocket, что Indy......посему на это и подумалось навскидку. :)
> У меня пока устойчивое подозрение на программные ошибки > - приемник бродкастов не привязан тому интерфейсу, через > который поступают бродкасты.
Возможно, даже очень, но: > Если оба приложения расположены на одном компьютере, то > всё нормально и запрос сервером нормально принимается и > обрабатывается. просто хотелось выяснить: > Я знаю, что коммутатор может не пропускать такие запросы, > поэтому компьютеры соединил прямым кроссовым кабелем. Фаерволов > на компьютерах не установлено (Правда на одном стоит Каспер. > Может в этом дело? Мой препод говорит, что врядли это из- > за антивируса).
а сеть то между двумя компами вообще функционирует? И если да - то тогда уже копать программу. :)
-
Осталось выслушать самого начальника транспортного цеха)
-
Брандмауэр выключен как служба (т.е. вообще эта служба не запускается). Кабель, конечно, оверкросовый. Сначалдо пробовал через коммутатор - та же история. Ща выложу часть кода программы, но я вроде всё делала в соответствии с учебником, поэтому, сомневаюсь, что есть программные ошибки, так как там ничего сверхсложного нет. Думаю, что всё-таки что-то с настройками системы
Вот код сервера:
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 в настройках самого сервера
-
Вот клиент:
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
-
Ну и зачем ты эту кучу говна вывалил сюда ?)
От тебя и требовалось всего-то - изложить свои соображения насчет привязки твоего клиента и/или сервера к сетевым интерфейсам.
Только не говори, что ни ты ни препод не знаете что это за звери)
-
Что-то я не вижу здесь "Клиент посылает широковещательный UDP запрос с помощью IdUDPClient".
Единственная содержательная строчка "IdUDPClient1.Send('ARP'+IP+':'+MAC);" никакого такого широковещательного запроса не посылает.
-
> Единственная содержательная строчка "IdUDPClient1.Send('ARP'+IP+': > '+MAC);" никакого такого широковещательного запроса не посылает. >
:))) Автор думает иначе. IdUDPClient1.Broadcast('Hello',10000); ???
-
В книге было написано, что если поле с местом назначения запроса не указано, то запрос будет широковещательным..
-
> Михаил (Питер) (11.03.08 12:30) [15]
Ты вообще какую версию Инди мучаешь ? Если 9-ку, то книгу эту, если она именно про 9-ку, выкинь в корзину.
-
а почему тогда на одном компьютере два приложения нормально функционируют через такие как у меня "широковещательные" запросы?
-
Потому что
ShowMessage(GStack.ResolveHost(idudpclient1.Host));
-
Блин, в натуре так и есть ) Спасибо большое
|