Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> NewClient.DNS := AThread.Connection.LocalN, Не работает данный код !!! 
:(
    Опции темы
wagner
Дата 21.9.2005, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.5.2005

Репутация: нет
Всего: нет



Добрый день !

Помогите плиз !

Всем известен пример Indy 9 : idTCPDemo , а именно чат так сказать на Indy TCP.
Так вот - компилим примерчик и стартуем сервер на машине А и два клиента на машинах B C
Получаем при соединении клиентов с сервером в окошек протокола сервера :

Код

15:56:40 Connection from "server_a"
15:56:41 Connection from "server_a"


То есть имеем в этом коде :

Код

procedure TServerFrmMain.ServerConnect(AThread: TIdPeerThread);
var
  NewClient: PClient;

begin
  GetMem(NewClient, SizeOf(TClient));

[b]  NewClient.DNS         := AThread.Connection.LocalName;[/b]
  NewClient.Connected   := Now;
  NewClient.LastAction  := NewClient.Connected;
  NewClient.Thread      :=AThread;

  AThread.Data:=TObject(NewClient);

  try
    Clients.LockList.Add(NewClient);
  finally
    Clients.UnlockList;
  end;

  Protocol.Lines.Add(TimeToStr(Time)+' Connection from "'++' '+NewClient.DNS+'"');
end;


NewClient.DNS = server_a - вот значит какое имя у клиента 1 и ровно такое-же имя у клиента 2
Это конечно не мешает кидаться Broadcast сообщениями и слать сообщения на сервер, но
это не позволяет кинуть сообщение с одного клиента на другого !

(Это прописано в строчке :
Код

begin
            RecClient:=Items[i];
            [b]if RecClient.DNS=CommBlock.ReceiverName then  // we don't have a login function so we have to use the DNS (Hostname)[/b]            begin


конечно если закомментировать "if ..." то все ок ..но все же вопрос :

как на этапе соединения определить кто подключается к серверу ?

C Уважением Wagner
PM MAIL   Вверх
Snowy
Дата 21.9.2005, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Тут и сказать нечего.
Вроде все правильно. Должно работать.
Но я даже проверить не могу - у меня клиент виснет намертво.
Попробуй Iny 10. Может там поправлено...
PM MAIL   Вверх
wagner
Дата 21.9.2005, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.5.2005

Репутация: нет
Всего: нет



Там в принципе те же пироги - вместо

Код

[b]NewClient.DNS         := AThread.Connection.LocalName;[/b]

вот эта строчка :

[b]NewClient.DNS         := AContext.Connection.LocalName;[/b]

смысл остался тот же
но это обходиться кажется так:

[b]NewClient.DNS         := AContext.Connection.Binding.PeerIP;[/b]


Но не в этом суть просто у меня Delphi7 + Indy 9 - ставить Indy 10 не хочется
(по 9 то мало информации а по 10 и подавно ...)

Как бы при соединении подложить реальный IP или Имя клиента именно в 9 - может есть мысли ?

C Уважением Wagner
PM MAIL   Вверх
Snowy
Дата 21.9.2005, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 53
Всего: 484



Может
Client.DNS := AThread.Connection.Socket.Binding.IP;

PM MAIL   Вверх
wagner
Дата 21.9.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 18.5.2005

Репутация: нет
Всего: нет



Не не катит - я тут вот написал - работает ..но чуйствую криво это все !!!
Может поправите (так все на ура - если из под Delphi то ошибки ...)


Сервер обработка соединения

Код

procedure TServerFrmMain.ServerConnect(AThread: TIdPeerThread);
var
  NewClient: PClient;
  CommBlock: TCommBlock;
begin
  GetMem(NewClient, SizeOf(TClient));

  NewClient.DNS         := AThread.Connection.LocalName;
  NewClient.Connected   := Now;
  NewClient.LastAction  := NewClient.Connected;
  NewClient.Thread      := AThread;

  AThread.Data:=TObject(NewClient);
  try
    NewClient := PClient(AThread.Data);
    AThread.Connection.ReadBuffer (CommBlock, SizeOf (CommBlock));
    NewClient := PClient(AThread.Data);
    NewClient.DNS:=CommBlock.MyUserName;

    if CommBlock.Msg='HELO' then
    begin
    Clients.LockList.Add(NewClient);
    Protocol.Lines.Add(TimeToStr(Time)+' Установлено соединение с " '+NewClient.DNS+'"');
    Clients.UnlockList;
    end
    else
    begin
    Protocol.Lines.Add (TimeToStr(Time)+' Disconnect from "'+NewClient^.DNS+'"');
    Clients.LockList.Remove(NewClient);
    Clients.UnlockList;
    FreeMem(NewClient);
    AThread.Data := nil;
    end;
  finally
 //    Clients.UnlockList;
  end;


И Клиент обработка соединения

Код

procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
var
CommBlock : TCommBlock;
begin
  if CBClientActive.Checked then
  begin
    try
      Client.Connect(10000);  // in Indy < 8.1 leave the parameter away

      ClientHandleThread := TClientHandleThread.Create(True);
      ClientHandleThread.FreeOnTerminate:=True;
      ClientHandleThread.Resume;

      CommBlock.MyUserName   := Client.LocalName;
      CommBlock.Msg          := 'HELO';

      Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);

    except
      on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
    end;
  end
  else
  begin
    ClientHandleThread.Terminate;
    Client.Disconnect;
  end;

  ButtonSend.Enabled := Client.Connected;
  CBClientActive.Checked := Client.Connected;
end;


Вот сомневаюсь я ...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0705 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.