![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как организовать связь чатов в локальной сети? [D5, Win95/98, Win2k, WinXP]
Knight © (2003-04-15 23:19:00)Всем, привет!
Люди, нарисуйте, кто знает, общую схему организации связи между чатами в локальной сети. Все примеры, которые нашёл, завязаны на сокетах по схеме Клиент-Сервер... это понятно, но нигде не поясняется что делать в случае если чат который выполнял функции сервера попрощался и закрылся. Что, переорентировать в сервер один из оставшихся? А может можно как-то организовать широковещание? Что-то я компонента такого не обнаружил.
Если не трудно, укажите рядом с блоками схемы, какие компоненты из стандартного набора D5 можно для них использовать.
Illusion (2003-04-27 23:48:00) [1]НАРОД! ВЫ ЧЁ???
Пишите 255.255.255.255! И НЕ ПАРТЕСЬ!!!
inet_addr("255.255.255.255") = INADDR_BROADCAST!!!!!
Кто не верит - проверьте!
работает в стеях от класса A (сам в такой сижу), и С (там тоже такое стоит) следовательно будет работать и сетях класса B!
Knight (2003-04-27 21:33:00) [2]Сокеты исключения генерят, а широковещательные месаги, по выше приведённой схеме, посылаются... и никаких исключений.
MMF (2003-04-21 14:11:00) [3]>Knight © (21.04.03 13:18)
Ну дык два сокета с одним портом создать на одной машине не удастся - отлавливай исключение, а дальше думай сам, что делать.
Knight (2003-04-21 13:18:00) [4]>> MMF
> 1) порты до 2000 считаются служебными, далее -
> пользовательскими. какой нравится, такой и выбери.
А если не мне одному понравится какой-то порт... это не вызовет конфликтов или глюков? А если да, то можно ли выбрать порт динамически из тех что свободны, т.е. как узнать что такой-то порт ничем не занят?
Спрашиваю это потому, что пытался законнектить два экземпляра на одной машине... ничего не вышло. посылают оба, а получает только один, значит что-то мешает, ставил на обеих Local=Remote, хотя надо было наверно попробовать Local1=Remote2; Local2=Remote1... но щас уже проверять некогда, через полчаса поезд на Питер, недельная командировка. Надеюсь, что за неделю этот вопрос в архив не уйдёт... :)
До встречи!
MMF (2003-04-21 12:12:00) [5]>EvgeniyR © (21.04.03 08:27)
Работает, но не всегда - помимо IP сетей класса C, бывают и сети класса B. Я говорю только про свой личный опыт - я тоже пробовал так сделать - не работало, возможно из-за моих ошибок.
>Knight © (19.04.03 21:09)
1) порты до 2000 считаются служебными, далее - пользовательскими. какой нравится, такой и выбери.
2) При входе новой машины - пусть она посылает всем широковещательную команду на оповещение о себе, т.е. при входе нового - "Общая перекличка"
Твой вариант лучше. Но я просто скопировал кусок кода из своего проекта, я и сам не знаю зачем тогда копировал посимвольно.
EvgeniyR (2003-04-21 08:27:00) [6]>> но только так как в EvgeniyR © (18.04.03 13:25) не получится.
Не правда, все работает!
Knight (2003-04-19 21:09:00) [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) Бывает, что какая либо машина вылетает и в некоторых чатах остаются висеть "мёртвые души", как этого исправить? Посылать по таймеру запрос, чтоб все заявили о себе что-ли?
MMF (2003-04-19 10:18:00) [8]>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 00:00:00) [9]
> Используй UDP
> UDP1.BroadCast := true
А где этот UDP? Все вкладки проверил... только NMUDP, но у него нет свойства BroadCast.
MMF (2003-04-18 16:18:00) [10]Для оповещения о входе/выходе используй broadcast message, но только так как в EvgeniyR © (18.04.03 13:25) не получится. Сначала определи старшие разряды текущего IP машины, а младшие замени на 255: ХХХ.ХХХ.ХХХ.255
EvgeniyR (2003-04-18 13:25:00) [11]Используй UDP
UDP1.Host := 255.255.255.255 //Отправит на все компы
UDP1.BroadCast := true
Knight (2003-04-17 22:08:00) [12]Мастаки!!! Аууу!!!!!
Knight (2003-04-16 14:54:00) [13]Неужели никто не может ничего сказать по этому поводу??? :(