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

Вниз

Broadcast   Найти похожие ветки 

 
NickolayLI   (2002-11-13 14:59) [0]

привет всем

кто-нить использует компоненты Indy idUDpClient and idUDPServer?

не получается реализовать broadcast, ессли клиента запустить на же машине где и программа-сервер, то клиент к серверу цепляется, а если клиента запустить на какой-нить другой тачке в локалке, то клиент посылая broadcast и сервер не видит :(

Пока


 
NickolayLi   (2002-11-13 22:00) [1]

Парни не дайте умереть :((


 
NickolayLI   (2002-11-14 13:40) [2]

Парни? посоветуйте плиз че-нить....
голова не варит уже....

пока.


 
nickolayLI   (2002-11-15 13:18) [3]

Никто не знает? :(


 
Song ©   (2002-11-15 13:30) [4]

А обязательно надо отправить broadcast UDP через компоненты?


 
nickolayLI   (2002-11-15 14:08) [5]

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



 
Song ©   (2002-11-15 14:13) [6]

А через компоненты это не программно? :)


 
nickolayLI   (2002-11-15 14:16) [7]

нет, имеется ввиду без компонент на форме :)


 
Song ©   (2002-11-15 14:25) [8]

Не знаю то ли я понял, что Вам нужно.. Попробуйте вот это:

procedure TMainForm.FormCreate(Sender: TObject);
var Init:TWSAData;
SockOpt:BOOL;
Sock:TSocket;
Target:TSockAddrIn;
begin
WSAStartup($101,Init);
Sock:=Socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP);
SockOpt:=TRUE;
SetSockOpt(Sock,SOL_SOCKET,SO_BROADCAST,PChar(@SockOpt),SizeOf(SockOpt)) ;
Target.sin_port:=htons(8167);//номер порта
Target.sin_addr.S_addr:=INADDR_BROADCAST;
Target.sa_family:=AF_INET;
SendTo(Sock,Data,DataBytes,0,Target,SizeOf(Target));
WSACleanup;
end;


 
nickolayLI   (2002-11-15 14:33) [9]

это я так понял для клиента.


 
nickolayLI   (2002-11-15 16:34) [10]

пакеты рассылает но программа сервер их не ловаит :(
хотя тама idUDPServer


 
nickolayLI   (2002-11-15 16:38) [11]

мне не понятно почему у idUDPClient толком не пашет
IdUDPClient1.BroadcastEnabled := True;
IdUDPClient1.SendBuffer("255.255.255.255", IdPORT_ECHO,
Packet, SizeOf(Packet));


 
Digitman ©   (2002-11-15 16:47) [12]


> хотя тама


Хотя тута - у тебя перед носом - полные исходники Indy и хэлп "Winsock2 API programmer"s reference", они, видимо, для Пушкина существуют, который уже "тама" ?)


 
nickolayLI   (2002-11-15 16:56) [13]

Посмотрел хелп, и что простое описание функции, исходников от Инди у меня нету, только библы...


 
Digitman ©   (2002-11-15 17:13) [14]


> Посмотрел хелп, и что простое описание функции


На то хэлп и существует


> исходников от Инди у меня нету


Оч жаль. Ищи. Или откажись от Indy.
Совет : никогда не пользуйся "халявным" софтом без исх.текстов, если есть альтернатива


 
nickolayLI   (2002-11-15 17:15) [15]

а чем юзать стандартным? не подходит.
мне нужно имеенно broadcast.


 
Digitman ©   (2002-11-15 17:29) [16]


> мне нужно имеенно broadcast.


Ну и юзай то, что двигает <Song> ! Какие проблемы-то ?

А касаемо UDP-сервера ..
Поясни, что ты хочешь поиметь от серверной стороны ? Какую функц-ть ?


 
nickolayLI   (2002-11-15 17:39) [17]

клиент просто по сети шлет широковещательные пакеты, а сервер должен их поймать по идее, мне просто интересно как это реализовывается всё :(, помал от клиент пакет, передал обратно клиенту что сервер есть и всё, больше ничего :(
а у меня не выходит...
а <Song> что такое и где его взять можно?


 
Digitman ©   (2002-11-15 17:42) [18]

ну а причем здесь функц-ть ИМЕННО СЕРВЕРА ? Любой UDP-компонент, будь то хоть TNMUDP, делает то, что тебе нужно


 
nickolayLI   (2002-11-15 17:47) [19]

да он делает, то что нужно, если я ему укажу RemoteHost=
10.1.1.255, но если сделать RemoteHost=255.255.255.255 то не видит клиент сервер, и всё тут :((


 
nickolayLI   (2002-11-15 20:01) [20]

Эх...


 
BackStabber   (2002-11-17 17:46) [21]

Так, я тоже долго парился потом все проблемы решились.
Вообще советую TIdUDPClient не пользоваться остановись на сервере, там отличия минимальные=)
В Default port устанавливаешь порт, по которому будем слушать, после этого можеш компоненту акнивизировать. Отправка сообщения
таким макаром:
ABinding.SendTo(ABinding.PeerIP, Variables.UDPWriteSocket ,s, Length(s)); (ну это, конечно, не самый удачный пример, просто в событии OnUDPRead я отвечаю опять же по UDP тому, о кого пришло сообщение)
Соответственно, PeerIP - IP приславшего мессагу
Variables.UDPWriteSocket - сокет, по которому отправляем мессагу
Солответственно он должен быть таким же и у DefaultPort принимающего
s - строка, которую отправляем
следующий параметр вроде все ясно)


Вот и все если будут вопросы пиши на мыло помогу

nikk@altec.ru


 
Malder ©   (2002-11-17 21:59) [22]

Приведи исходник приема броадкаста сервером.


 
nickolayLI   (2002-11-18 13:22) [23]

2>Malder
на клиенте в обработчике OnTimer
Packet := 4096;
IdUDPClient1.BroadcastEnabled := True;
IdUDPClient1.Binding.SendTo("255.255.255.255", 7, Packet,
SizeOf(Packet));
IdUDPClient1.BroadcastEnabled := False;
ReceivedString := IdUDPClient1.ReceiveString();
if ReceivedString = "" then begin
Memo1.Lines.Clear;
Memo1.Lines.Add("No response received from the server
after " + IntToStr
(IdUDPClient1.ReceiveTimeout) + "
millseconds.")
end;
end;
на сервере
при создании формы:
IdUDPServer1 := TIdUDPServer.Create(nil);
with IdUDPServer1 do begin
Bindings.Add.Port := 7;
DefaultPort := 3333;
ThreadedEvent := True;
BroadcastEnabled := True;
OnUDPRead := UDPServerUDPRead;
BufferSize := 4096;
Active := True;
end;

procedure TmainForm.UDPServerUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
DataStringStream: TStringStream;
s: String;
begin
DataStringStream := TStringStream.Create("");
try
DataStringStream.CopyFrom(AData, AData.Size);
s := ABinding.PeerIP;
ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s));
finally
DataStringStream.Free;
end;
end;


//end;


 
Malder ©   (2002-11-18 18:26) [24]

А теперь скажи. Если ты будешь делать так:

IdUDPClient1.Binding.SendTo(" 10.1.1.255", 7, Packet, SizeOf(Packet));

то работает ?

Если работает, то значит не пиши 255.255.255.255

И вообще, вроде в инди есть спец. функция для отправки броадкастов. Что-то типа SendBroadcast (или как-то так, поищи). А ты пользуешься SendTo

P.S. И вообще, пользуйся WinApi или каким-нибудь простеньким TNMUDP. А то я смотрю инди какой-то навороченный через одно место...


 
NickolayLi   (2002-11-18 18:50) [25]

2>Malder

SendBroadcast, есть такое дело, но оно делает тоже самое, xто и SendTo(..). (Хелпа под рукой нету, так бы показал :( )
SendTo("10.1.1.255", 7, Packet, SizeOf(Packet));
^^ - у меня несколько подсетей!
Я в предыдущих сообщениях писал уже об этой проблеме!
До свидания...


 
Malder ©   (2002-11-18 22:42) [26]

Ну SendBroadcast не может делать тоже самое, что SendTo, ибо нафига тогда оно нужно ?

А если несколько подсетей - рассылай в несколько подсетей броадкасты.

А какие подсети у тебя есть ?


 
nickolayLI   (2002-11-19 07:15) [27]

это я у себя знаю сколько у меня подсетей, а вот допустим у какого-нить клиента, откуда я могу знать сколько у него подсетей :)


 
Malder ©   (2002-11-19 18:45) [28]

Рассылай как посоветовал Song © (15.11.02 14:25)



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

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

Наверх




Память: 0.53 MB
Время: 0.014 c
14-62740
KIR
2003-01-04 12:05
2003.01.20
Народ, у кого стоит RxLib+D7? Нормально работает?


3-62431
Kesha
2002-12-26 08:19
2003.01.20
Перенос данных с Exsel в


4-62929
alvin
2002-12-03 09:51
2003.01.20
WM_HOTKEY


1-62457
Артём К
2003-01-10 04:53
2003.01.20
Запись и чтение файла из определённого места


4-62892
krammer
2002-12-01 19:35
2003.01.20
Как узнать общее и свободное место диска менее 2 гб ?