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

Вниз

Чат или как найти все серверы?   Найти похожие ветки 

 
Keal   (2005-04-24 00:48) [0]

Привет всем.
Хочу написать программу для отсылания сообщения, и чтоб в ней был список всех компов на которых запущеня эта программа.
Делать отдельный сервер не хочу. Остается только, что бы каждая программа запускала свой сервер. Проверку на наличие сервера делаю подключением клиента. Если на проверяемой машине сервер запущен, то результат моментальный, если же сервера нет, то клиент стоит 1-2 сек. А если в сети 200 компов, то проверка затягивается надолго.
Пробовал с TSocketServer и с TcpServer.
Как реализовать моментальную проверку? И может ли клиент отослать все сообщение на все машины, а серверы ловили бы их. И можно это реализовать без сокетов?


 
kami ©   (2005-04-24 02:15) [1]


> Как реализовать моментальную проверку

ИМХО, моментальную - никак. При всем желании, поиск уже занимает какое-то время.

> И может ли клиент отослать все сообщение на все машины

Может, смотри в сторону широковещательного UDP пакета. Лучше всего(о5 имхо) использовать Indy UDPSocket`s. Клиент отсылает нужную информацию (broadcast), сервер(ы) ловят и обрабатывают.

> И можно это реализовать без сокетов

Каким боком? Даже ручная отправка широковещательного пакета подразумевает создание сокета. Разве что вручную набить 200 адресов.
В общем, Indy в руки :)


 
X-Disa ©   (2005-04-24 09:31) [2]

Я писал чат, и делал так. Использую протокол UDP  - ставлю на форму UDP клиент и UDP сервер. Когда хочу всех проверить - шлю сообщения на широковещательный адрес в сети - например 192.161.16.255.
На каждой проге UDP сервер ловит сообщения и отвечает.
На проге, которая запрашивала, UDP сервер ловит ответ.
Кажется сложно, особенно в моем чате, где 15 типов сообщений. :)

Слать просто - UDPClient.Send("0"), 0 - запрос
Ловить так:

procedure TFMain.UDPServerUDPRead(Sender: TObject; AData: TStream;
 ABinding: TIdSocketHandle);
var
 StringFormatedStream: TStringStream;
 msgType:integer;
 MSG,S:string;
begin
try
StringFormatedStream := TStringStream.Create("");
StringFormatedStream.CopyFrom(AData, AData.Size);
MSG:=StringFormatedStream.DataString;
msgType:=StrToInt(MSG)

Case msgType of
0: //Вы есть? - тут посылаем ответ UDPClient.Send("1")
1: //Нам пришел ответ, добавляем комп в список например по IP -  ABinding.PeerIP
end;

ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, s[1], Length(s)); //перенаправляем сообщение
StringFormatedStream.Free;
except end;
end;


 
Keal   (2005-04-25 12:21) [3]

Спасибо всем. Проблему решил используя UDP.



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

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

Наверх




Память: 0.47 MB
Время: 0.027 c
1-1121203658
КАСК
2005-07-13 01:27
2005.08.07
Где находится список того, в какой очерёдности находятся


14-1121389485
Джо
2005-07-15 05:04
2005.08.07
To whom it may concern.


3-1120021017
Jonny210
2005-06-29 08:56
2005.08.07
Ошибка при добавлении/редактировании записи


4-1118032871
Салават
2005-06-06 08:41
2005.08.07
описание файлов


1-1121342706
MegaVolt
2005-07-14 16:05
2005.08.07
Подскажите простенькую замену TListView в виртуальном режиме.