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

Вниз

Как организовать связь чатов в локальной сети?   Найти похожие ветки 

 
Knight ©   (2003-04-15 23:19) [0]

Всем, привет!

Люди, нарисуйте, кто знает, общую схему организации связи между чатами в локальной сети. Все примеры, которые нашёл, завязаны на сокетах по схеме Клиент-Сервер... это понятно, но нигде не поясняется что делать в случае если чат который выполнял функции сервера попрощался и закрылся. Что, переорентировать в сервер один из оставшихся? А может можно как-то организовать широковещание? Что-то я компонента такого не обнаружил.

Если не трудно, укажите рядом с блоками схемы, какие компоненты из стандартного набора D5 можно для них использовать.


 
Knight ©   (2003-04-16 14:54) [1]

Неужели никто не может ничего сказать по этому поводу??? :(


 
Knight ©   (2003-04-17 22:08) [2]

Мастаки!!! Аууу!!!!!


 
EvgeniyR ©   (2003-04-18 13:25) [3]

Используй UDP
UDP1.Host := 255.255.255.255 //Отправит на все компы
UDP1.BroadCast := true


 
MMF ©   (2003-04-18 16:18) [4]

Для оповещения о входе/выходе используй broadcast message, но только так как в EvgeniyR © (18.04.03 13:25) не получится. Сначала определи старшие разряды текущего IP машины, а младшие замени на 255: ХХХ.ХХХ.ХХХ.255


 
Knight ©   (2003-04-19 00:00) [5]


> Используй UDP
> UDP1.BroadCast := true


А где этот UDP? Все вкладки проверил... только NMUDP, но у него нет свойства BroadCast.


 
MMF ©   (2003-04-19 10:18) [6]

>Knight © (19.04.03 00:00) Использую NMUDP
определим свой IP адрес
function my_ip_address: string;
const
bufsize=255;
var
buf: pointer;
RemoteHost : PHostEnt;
begin
buf:=NIL;
try
getmem(buf,bufsize);
winsock.gethostname(buf,bufsize);
RemoteHost:=Winsock.GetHostByName(buf);
if RemoteHost=NIL then
my_ip_address:="127.0.0.1"
else
with RemoteHost^ do
begin
Result := Format("%d.%d.%d.%d",[
Byte(h_addr^[0]),
Byte(h_addr^[1]),
Byte(h_addr^[2]),
Byte(h_addr^[3])]);
end;
finally
if buf<>NIL then freemem(buf,bufsize);
end;
end;

//формируем широковещательный адрес
CurIP:=my_ip_address;
if Trim(CurIP)="" then
begin
MessageDlg("Ошибка определения сетевого адреса", mtError, [mbOK], 0);
Application.Terminate;
end;
NMUDP1.RemoteHost:=CurIP;
i:=LastDelimiter(".", CurIP);
BroadcastIP:=copy(CurIP, 1, i)+"255";


procedure TForm1.SayAboutSelf();
var i, cnt: integer;
mess: string;
Temp: string;
begin
//оповещение о себе
Temp:=NMUDP1.RemoteHost;
NMUDP1.RemoteHost:=BroadCastIP;
mess:="$" + CurIP + "$"+ CurNick;
cnt:=Length(mess);
for I:=1 to cnt do Buffer[i-1]:=Mess[I];
NMUDP1.SendBuffer(Buffer, cnt);
NMUDP1.RemoteHost:=Temp;
end;


 
Knight ©   (2003-04-19 21:09) [7]

>> MMF

Спасибо, за наиболее подробный ответ из имеющихся.

А чем плох такой вариант?


procedure TForm1.SayAboutSelf;
var cnt: integer;
mess: string;
Temp: string;
begin
//оповещение о себе
Temp:=NMUDP1.RemoteHost;
NMUDP1.RemoteHost:=BroadCastIP;
mess:="$" + CurIP + "$"+ CurNick;
//---> cnt:=Length(mess);
//---> for I:=1 to cnt do Buffer[i-1]:=Mess[I];
//---> NMUDP1.SendBuffer(Buffer, cnt);
NMUDP1.SendBuffer( mess[1], Length(mess));
NMUDP1.RemoteHost:=Temp;
end;


И ещё пара вопросов.
1) Без LocalPort и RemotePort это не работает, а как их правильно выбрать?

2) Бывает, что какая либо машина вылетает и в некоторых чатах остаются висеть "мёртвые души", как этого исправить? Посылать по таймеру запрос, чтоб все заявили о себе что-ли?


 
EvgeniyR ©   (2003-04-21 08:27) [8]

>> но только так как в EvgeniyR © (18.04.03 13:25) не получится.

Не правда, все работает!


 
MMF ©   (2003-04-21 12:12) [9]

>EvgeniyR © (21.04.03 08:27)
Работает, но не всегда - помимо IP сетей класса C, бывают и сети класса B. Я говорю только про свой личный опыт - я тоже пробовал так сделать - не работало, возможно из-за моих ошибок.
>Knight © (19.04.03 21:09)
1) порты до 2000 считаются служебными, далее - пользовательскими. какой нравится, такой и выбери.
2) При входе новой машины - пусть она посылает всем широковещательную команду на оповещение о себе, т.е. при входе нового - "Общая перекличка"
Твой вариант лучше. Но я просто скопировал кусок кода из своего проекта, я и сам не знаю зачем тогда копировал посимвольно.


 
Knight ©   (2003-04-21 13:18) [10]

>> MMF
> 1) порты до 2000 считаются служебными, далее -
> пользовательскими. какой нравится, такой и выбери.
А если не мне одному понравится какой-то порт... это не вызовет конфликтов или глюков? А если да, то можно ли выбрать порт динамически из тех что свободны, т.е. как узнать что такой-то порт ничем не занят?

Спрашиваю это потому, что пытался законнектить два экземпляра на одной машине... ничего не вышло. посылают оба, а получает только один, значит что-то мешает, ставил на обеих Local=Remote, хотя надо было наверно попробовать Local1=Remote2; Local2=Remote1... но щас уже проверять некогда, через полчаса поезд на Питер, недельная командировка. Надеюсь, что за неделю этот вопрос в архив не уйдёт... :)

До встречи!


 
MMF ©   (2003-04-21 14:11) [11]

>Knight © (21.04.03 13:18)
Ну дык два сокета с одним портом создать на одной машине не удастся - отлавливай исключение, а дальше думай сам, что делать.


 
Knight ©   (2003-04-27 21:33) [12]

Сокеты исключения генерят, а широковещательные месаги, по выше приведённой схеме, посылаются... и никаких исключений.


 
Illusion ©   (2003-04-27 23:48) [13]

НАРОД! ВЫ ЧЁ???
Пишите 255.255.255.255! И НЕ ПАРТЕСЬ!!!
inet_addr("255.255.255.255") = INADDR_BROADCAST!!!!!
Кто не верит - проверьте!
работает в стеях от класса A (сам в такой сижу), и С (там тоже такое стоит) следовательно будет работать и сетях класса B!



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

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

Наверх




Память: 0.5 MB
Время: 0.023 c
14-7706
Burmistroff
2003-06-14 18:31
2003.07.03
www.coderz.net = 127.0.0.1 ???


14-7643
kull
2003-06-15 15:27
2003.07.03
Количественные оценки качества кода...


3-7367
grifon_nn
2003-06-09 17:43
2003.07.03
Резервная копия


1-7443
stalker780
2003-06-23 13:35
2003.07.03
Отладка DLL


3-7350
Man
2003-06-10 12:08
2003.07.03
локальная база с мин. требованием к ресурсам