Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
3-7302
Alexei
2003-06-09 03:49
2003.07.03
Как cоздать команду... в Db


4-7756
Ariman
2003-04-17 13:05
2003.07.03
Проблема с ShellExecute


1-7508
TDIONIS
2003-06-21 11:09
2003.07.03
Скриншот


14-7691
Кен
2003-06-17 03:29
2003.07.03
На чём написан Дельфи. На Си или на Дельфи ?


4-7768
Great_Lesh
2003-05-01 09:41
2003.07.03
Заголовочный файл CreateProcessWithLogonW





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский