Форум: "Сети";
Текущий архив: 2003.01.20;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c