Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > TClient & Tserver sockets


Автор: coolikov 10.5.2006, 10:33
Здраствуйте у меня проблемка :
Пищу сетевую общалку.  нужно клиентом отправить текст (socket.sendtext) списку серверов(). 
(типа сообщить всем что он онлайн)

Пробую так :
  
Код

   for i:=1 to n do
     begin
      ClientSocket1.Active  := False;
      ClientSocket1.Host:=имя i-го  хоста;
      ClientSocket1.Active := True;
      ClientSocket1.Socket.SendText(msg);
     end;

но коннекта с хостом не происходит
пробовал ставить задержку между :

      ClientSocket1.Active := True;
и
     ClientSocket1.Active  := False;

но скоко не ставил(по врем. даже бесконечный цикл) конект так и не происходит почему smile 

мож че не так делаю????????
мож есть другой способ????
мож можно просто как-то пропинговать запущены ли на удаленных компах ТServerSocket"ы??????

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

______________________________
в программе есть и клиент и сервер.
(т.е общего сервера для всех нет)
 

Автор: Демо 10.5.2006, 10:38
Для твоего случая:

Код

  ClientSocket1.Open;
  while not ClientSocket1.Active do Application.ProcessMessages;
  ClientSocket1.SendText(...);
 

Автор: Matematik 10.5.2006, 10:41
Ты работаешь с неблокирующим сокетом.

http://www.delphimaster.ru/articles/sockets/index.html
http://www.delphimaster.ru/articles/socksrv/index.html 

Автор: coolikov 10.5.2006, 10:53
to Демо
а если сокета нет то программа просто стопиться и все!!!!
А мне надо узнать есть ли он smile  

Автор: Romikgy 10.5.2006, 11:00
Имхо создавай сокеты динамически,  таких траблов не будет 

Автор: Демо 10.5.2006, 11:29
Цитата(coolikov @  10.5.2006,  10:53 Найти цитируемый пост)
а если сокета нет то программа просто стопиться и все!!!!


Ну так тогда делай правильно. Используй обработку событий OnConnect и OnError. 

Автор: coolikov 10.5.2006, 11:31
to Romikgy
Ты имееш ввиду что можно сервер сделать статич
а при каждой посылке заново дин создавать сокет(клиентский) и приконекчивать к нужному серверу потом его дестроить smile 
А какие преимушества smile  
Обьясни плизз

Добавлено @ 11:46 
to Демо
да при попытке коннекта к несущ сокету у меня возникает OnError но как от него перейти к сканированию следующего компа т.е. к коду в процедуре : 
Код

 ClientSocket1.Host:=имя i-го  хоста;
 ClientSocket1.Open;    
  while not ClientSocket1.Active do Application.ProcessMessages;    
  ClientSocket1.SendText(...);

 smile 
З.Ы.
Понимаю что вопросы дурацкие, но ведь без вашей помоши не разобраться smile  

Автор: Romikgy 10.5.2006, 12:06
Цитата(coolikov @  10.5.2006,  10:31 Найти цитируемый пост)
А какие преимушества

Все настройки создаются заново + ждать не нужно сокет одуплится, 
будет что т наподобии хттп соединения, 
создался, соединился , передал сообщение, отключился, разрушился 

Автор: coolikov 4.7.2006, 14:50
Вот наконец то снова добрался до своей программки (лучше поздно чем никогда) smile 

to Romikgy
Плиззз обьяни или приведи пример(хоть схематический) как при динамическом криэйте сокета сразу понять запушен ли на хосте, к которому он пытаеться коннектиться, сервер?

 smile  

Автор: _hunter 4.7.2006, 15:52
сразу -- никак. делается это попыткой подключиться: получилось -- значит запущен, не получилось -- значит нет. 

Автор: coolikov 4.7.2006, 16:08
но тогда не вижу смысла в динамическом создании сокетов smile 

ныне  думаю что отсылать сообщение типа "онлайн" (как я писал в начале топиеа смысла нет)
мне нужно просто попытаться приконнектиться  клиентом программы к списку серверов 
и тот серв, к которому можно приконектиться, пометить как онлайн
а тот,к которому не выйдет, как оффлайн.
проверка эта(пингование списка серверов) должна происходить постоянно в фоновом режиме
(смысл в том что бы показать пользователю кто в онлайн а кто нет)


вообщем счас есть такая проблема :

есть код:
Код

procedure pingall;
For i:=pc1 to pcN //(перебор всех компов) 
 while ((not form1.ClientSocket2.Active) and (form1.pinging=true)) do
     begin
       Application.ProcessMessages;
     end;
some code
end;


А ВОТ КОД ОБРАБОТЧИКА СОБЫТИЯ ОШИБКИ:

Код

procedure TForm1.ClientSocket2Error(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
     pinging:=false;
ErrorCode:=0;
end;


смысл задумки таков ---  коннектимся к соккету пока не приконнектимся или не произойдет ошибка в это время обрабатывая сообщения сиситемы

потом отвел эту процедуру pingall в отдельную нить(использовал класс Tthread)
но убрать       
   
Код

Application.ProcessMessages;


не могу 
тогда процесс висне и к следующему компу не переходит!!!! странно процесс та отдельный зачем ему 
Application.ProcessMessages  smile 

и следующий вопрос вооще не пойму но в таком виде (с Application.ProcessMessages и нитью ) сканирование проходит ток один раз
а в послендующий зацикливаеться на 

Код

while ((not form1.ClientSocket2.Active) and (form1.pinging=true)) do
     begin
       Application.ProcessMessages;
     end;


!!!!
З.Ы,
я уже в шоке, но всетаки надеюсь что с ВАШЕЙ помощью все получиться smile   

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)