Форум: "Сети";
Текущий архив: 2003.07.03;
Скачать: [xml.tar.bz2];
ВнизКак организовать связь чатов в локальной сети? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.288 c