![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Broadcast
NickolayLI © (2002-11-13 14:59:00)привет всем
кто-нить использует компоненты Indy idUDpClient and idUDPServer?
не получается реализовать broadcast, ессли клиента запустить на же машине где и программа-сервер, то клиент к серверу цепляется, а если клиента запустить на какой-нить другой тачке в локалке, то клиент посылая broadcast и сервер не видит :(
Пока
Malder (2002-11-19 18:45:00) [1]Рассылай как посоветовал Song © (15.11.02 14:25)
nickolayLI (2002-11-19 07:15:00) [2]это я у себя знаю сколько у меня подсетей, а вот допустим у какого-нить клиента, откуда я могу знать сколько у него подсетей :)
Malder (2002-11-18 22:42:00) [3]Ну SendBroadcast не может делать тоже самое, что SendTo, ибо нафига тогда оно нужно ?
А если несколько подсетей - рассылай в несколько подсетей броадкасты.
А какие подсети у тебя есть ?
NickolayLi (2002-11-18 18:50:00) [4]2>Malder
SendBroadcast, есть такое дело, но оно делает тоже самое, xто и SendTo(..). (Хелпа под рукой нету, так бы показал :( )
SendTo("10.1.1.255", 7, Packet, SizeOf(Packet));
^^ - у меня несколько подсетей!
Я в предыдущих сообщениях писал уже об этой проблеме!
До свидания...
Malder (2002-11-18 18:26:00) [5]А теперь скажи. Если ты будешь делать так:
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 13:22:00) [6]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-17 21:59:00) [7]Приведи исходник приема броадкаста сервером.
BackStabber (2002-11-17 17:46:00) [8]Так, я тоже долго парился потом все проблемы решились.
Вообще советую TIdUDPClient не пользоваться остановись на сервере, там отличия минимальные=)
В Default port устанавливаешь порт, по которому будем слушать, после этого можеш компоненту акнивизировать. Отправка сообщения
таким макаром:
ABinding.SendTo(ABinding.PeerIP, Variables.UDPWriteSocket ,s, Length(s)); (ну это, конечно, не самый удачный пример, просто в событии OnUDPRead я отвечаю опять же по UDP тому, о кого пришло сообщение)
Соответственно, PeerIP - IP приславшего мессагу
Variables.UDPWriteSocket - сокет, по которому отправляем мессагу
Солответственно он должен быть таким же и у DefaultPort принимающего
s - строка, которую отправляем
следующий параметр вроде все ясно)
Вот и все если будут вопросы пиши на мыло помогу
nikk@altec.ru
nickolayLI (2002-11-15 20:01:00) [9]Эх...
nickolayLI (2002-11-15 17:47:00) [10]да он делает, то что нужно, если я ему укажу RemoteHost=
10.1.1.255, но если сделать RemoteHost=255.255.255.255 то не видит клиент сервер, и всё тут :((
Digitman (2002-11-15 17:42:00) [11]ну а причем здесь функц-ть ИМЕННО СЕРВЕРА ? Любой UDP-компонент, будь то хоть TNMUDP, делает то, что тебе нужно
nickolayLI (2002-11-15 17:39:00) [12]клиент просто по сети шлет широковещательные пакеты, а сервер должен их поймать по идее, мне просто интересно как это реализовывается всё :(, помал от клиент пакет, передал обратно клиенту что сервер есть и всё, больше ничего :(
а у меня не выходит...
а <Song> что такое и где его взять можно?
Digitman (2002-11-15 17:29:00) [13]
> мне нужно имеенно broadcast.
Ну и юзай то, что двигает <Song> ! Какие проблемы-то ?
А касаемо UDP-сервера ..
Поясни, что ты хочешь поиметь от серверной стороны ? Какую функц-ть ?
nickolayLI (2002-11-15 17:15:00) [14]а чем юзать стандартным? не подходит.
мне нужно имеенно broadcast.
Digitman (2002-11-15 17:13:00) [15]
> Посмотрел хелп, и что простое описание функции
На то хэлп и существует
> исходников от Инди у меня нету
Оч жаль. Ищи. Или откажись от Indy.
Совет : никогда не пользуйся "халявным" софтом без исх.текстов, если есть альтернатива
nickolayLI (2002-11-15 16:56:00) [16]Посмотрел хелп, и что простое описание функции, исходников от Инди у меня нету, только библы...
Digitman (2002-11-15 16:47:00) [17]
> хотя тама
Хотя тута - у тебя перед носом - полные исходники Indy и хэлп "Winsock2 API programmer"s reference", они, видимо, для Пушкина существуют, который уже "тама" ?)
nickolayLI (2002-11-15 16:38:00) [18]мне не понятно почему у idUDPClient толком не пашет
IdUDPClient1.BroadcastEnabled := True;
IdUDPClient1.SendBuffer("255.255.255.255", IdPORT_ECHO,
Packet, SizeOf(Packet));
nickolayLI (2002-11-15 16:34:00) [19]пакеты рассылает но программа сервер их не ловаит :(
хотя тама idUDPServer
nickolayLI (2002-11-15 14:33:00) [20]это я так понял для клиента.