![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Широковещательный UDP запрос [D7, WinXP]
Михаил (Питер) © (2008-03-07 10:25:00)Есть два приложения, одно клиент, другое сервер. Клиент посылает широковещательный UDP запрос с помощью IdUDPClient. Если оба приложения расположены на одном компьютере, то всё нормально и запрос сервером нормально принимается и обрабатывается. Но вот, если на разных, запрос уходит, но сервером не воспринимается. Я знаю, что коммутатор может не пропускать такие запросы, поэтому компьютеры соединил прямым кроссовым кабелем. Фаерволов на компьютерах не установлено (Правда на одном стоит Каспер. Может в этом дело? Мой препод говорит, что врядли это из-за антивируса). В чём может быть проблема? Помогите, Мастера
Михаил (Питер) (2008-03-17 17:50:00) [1]Блин, в натуре так и есть ) Спасибо большое
Сергей М. (2008-03-11 14:13:00) [2]Потому что
ShowMessage(GStack.ResolveHost(idudpclient1.Host));
Михаил (Питер) (2008-03-11 13:52:00) [3]а почему тогда на одном компьютере два приложения нормально функционируют через такие как у меня "широковещательные" запросы?
Сергей М. (2008-03-11 13:37:00) [4]
> Михаил (Питер) (11.03.08 12:30) [15]
Ты вообще какую версию Инди мучаешь ?
Если 9-ку, то книгу эту, если она именно про 9-ку, выкинь в корзину.
Михаил (Питер) (2008-03-11 12:30:00) [5]В книге было написано, что если поле с местом назначения запроса не указано, то запрос будет широковещательным..
medved_68 (2008-03-11 09:02:00) [6]
> Единственная содержательная строчка "IdUDPClient1.Send('ARP'+IP+':
> '+MAC);" никакого такого широковещательного запроса не посылает.
>
:))) Автор думает иначе.
IdUDPClient1.Broadcast('Hello',10000);???
DiamondShark (2008-03-10 13:55:00) [7]Что-то я не вижу здесь "Клиент посылает широковещательный UDP запрос с помощью IdUDPClient".
Единственная содержательная строчка "IdUDPClient1.Send('ARP'+IP+':'+MAC);" никакого такого широковещательного запроса не посылает.
Сергей М. (2008-03-07 20:59:00) [8]Ну и зачем ты эту кучу говна вывалил сюда ?)
От тебя и требовалось всего-то - изложить свои соображения насчет привязки твоего клиента и/или сервера к сетевым интерфейсам.
Только не говори, что ни ты ни препод не знаете что это за звери)
Михаил (Питер) (2008-03-07 18:13:00) [9]Брандмауэр выключен как служба (т.е. вообще эта служба не запускается). Кабель, конечно, оверкросовый. Сначалдо пробовал через коммутатор - та же история. Ща выложу часть кода программы, но я вроде всё делала в соответствии с учебником, поэтому, сомневаюсь, что есть программные ошибки, так как там ничего сверхсложного нет. Думаю, что всё-таки что-то с настройками системы
Вот код сервера:
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.Size0 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 в настройках самого сервера
Михаил (Питер) (2008-03-07 18:13:00) [10]Вот клиент:
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)255)or(StrToInt(str)255)or(StrToInt(str)255)or(StrToInt(str)
Сергей М. (2008-03-07 11:47:00) [11]Осталось выслушать самого начальника транспортного цеха)
medved_68 (2008-03-07 11:19:00) [12]
> Но BSS-то причем ? Его приложение не имеет ничего общего
> с приложением BSS.
> с помощью IdUDPClient.
Хм....у меня при снятии галки с BSS блокирует что TServer/ClientSocket, что Indy......посему на это и подумалось навскидку. :)
> У меня пока устойчивое подозрение на программные ошибки
> - приемник бродкастов не привязан тому интерфейсу, через
> который поступают бродкасты.
Возможно, даже очень, но:
> Если оба приложения расположены на одном компьютере, то
> всё нормально и запрос сервером нормально принимается и
> обрабатывается.
просто хотелось выяснить:
> Я знаю, что коммутатор может не пропускать такие запросы,
> поэтому компьютеры соединил прямым кроссовым кабелем. Фаерволов
> на компьютерах не установлено (Правда на одном стоит Каспер.
> Может в этом дело? Мой препод говорит, что врядли это из-
> за антивируса).
а сеть то между двумя компами вообще функционирует? И если да - то тогда уже копать программу. :)
Сергей М. (2008-03-07 11:10:00) [13]
> переносит исполняемый файл допустим сервера, на другую машину
Ну переносит. Но BSS-то причем ? Его приложение не имеет ничего общего с приложением BSS.
> не оверкроссовым, а прямым
Под прямым, скорей всего, имелось ввиду соединение напрямую, а не через хаб.
Ессно разводка кабеля при этом д.б. кроссовой, а не прямой.
У меня пока устойчивое подозрение на программныеошибки - приемник бродкастов не привязан тому интерфейсу, через который поступают бродкасты.
medved_68 (2008-03-07 11:01:00) [14]
> А он-то тут причем ?
> Но вот, если на разных, запрос уходит, но сервером не воспринимается.
Я так понял, что переносит исполняемый файл допустим сервера, на другую машину (к примеру на ней нет предустановленной Дельфи и в исключениях брандмауэра нет этого пункта, опять телепатия :) ). Тогда при запуске приложения (если не включена опция предупреждения о блокировке (или вырублено, чтобы не раздражало :) ) будет просто заблокировано без всяких уведомлений. :) Но мне все таки подозрительно:
> поэтому компьютеры соединил прямым кроссовымкабелем
Сергей, заметь, не оверкроссовым, а прямым..... :))
Сергей М. (2008-03-07 10:52:00) [15]
> Borland Socket Server
А он-то тут причем ?
medved_68 (2008-03-07 10:49:00) [16]
> Какие такие "Борланд сокеты" ?
Borland Socket Server :))
> Брандмауер знать не знает и знать не обязан ни про какой
> борланд с его сокетами.
Знать то он не обязан, а вот блокировать..... :)
Сергей М. (2008-03-07 10:41:00) [17]
> в исключениях стоит Борланд сокеты?
Какие такие "Борланд сокеты" ?
Брандмауер знать не знает и знать не обязан ни про какой борланд с его сокетами.
medved_68 (2008-03-07 10:38:00) [18]
> Я знаю, что коммутатор может не пропускать такие запросы,
> поэтому компьютеры соединил прямым кроссовым кабелем.
И при этом расшаренные на одном компе папки видны на другом, и можно обмениваться файлами?
> Фаерволов на компьютерах не установлено
Брандмауэр включен? И если да - то в исключениях стоит Борланд сокеты?
Сергей М. (2008-03-07 10:36:00) [19]
> знаю, что коммутатор может не пропускать такие запросы
Коммутатору-то как раз глубоко фиолетово содержимое сетевых пакетов, так что эксперимент с прямым соединением был лишним.
Если ошибок в программе нет (что вряд ли), то дело, скорей всего, в ненастроенной или неверно настроенной маршрутизации.
По поводу ошибок - уточни к каким сетевым интерфейсам биндятся твои сервер и клиент ..