Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 ServerSocket проверка списка активных клиентов.  [new]
Валерий666
Member

Откуда:
Сообщений: 243
Есть программка сервер, крутиться на компе. Пока в таком виде:
+= Текст программки

procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
begin
mmo1.Lines.Add(Socket.ReceiveText) ;

end;

procedure TForm1.ServerSocket1ClientConnect(Sender: TObject;
  Socket: TCustomWinSocket);
  var L : integer;
begin
mmo1.Lines.Add('Client connected: '+Socket.RemoteAddress) ;
           
lst1.Items.Clear;
For L := 0 to ServerSocket1.Socket.ActiveConnections-1 do
 begin
  lst1.Items.Add(Socket.RemoteAddress);
 end;
end;

procedure TForm1.ServerSocket1ClientDisconnect(Sender: TObject;
  Socket: TCustomWinSocket);
   var L : integer;
begin
mmo1.Lines.Add('Client disconnected: '+Socket.RemoteAddress) ;
lst1.Items.Clear;
For L := 0 to ServerSocket1.Socket.ActiveConnections-1 do
 begin
  lst1.Items.Add(Socket.RemoteAddress);
 end;
end;

procedure TForm1.btn2Click(Sender: TObject);
var i:Integer;
begin
for i:= 0 to ServerSocket1.Socket.ActiveConnections -1 do
if ServerSocket1.Socket.Connections[i].RemoteAddress= lst1.Items.Strings[lst1.ItemIndex] then
    begin
      ServerSocket1.Socket.Connections[i].SendText(edt1.Text);
      break ;
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 ServerSocket1.Active:=true;
 mmo1.Clear;
end;

procedure TForm1.mmo1Change(Sender: TObject);
begin
mmo1.Text := StringReplace(mmo1.Text, #13#10#13#10, #13#10, [rfReplaceAll]);
mmo1.SelStart:= Length(mmo1.Text);
mmo1.SelLength:= 1;
end;

procedure TForm1.btn1Click(Sender: TObject);
var  kk:Integer;
 i:Integer;
 s:string;
begin
   kk:=+DayOfTheWeek(now);
for i:= 0 to ServerSocket1.Socket.ActiveConnections -1 do
if ServerSocket1.Socket.Connections[i].RemoteAddress= lst1.Items.Strings[lst1.ItemIndex] then
    begin
      ServerSocket1.Socket.Connections[i].SendText('set time '+FormatDateTime('ss,nn,hh,dd,mm,yy,'+inttostr(kk),now));
      break ;
    end;
end;

procedure TForm1.ServerSocket1ClientError(Sender: TObject;
  Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
  var ErrorCode: Integer);
begin
   mmo1.Lines.Insert(0,'Client error. Code = '+IntToStr(ErrorCode));
end;




В качестве клиентов железки на ESP8266.
Железка получает питание, подключается к серверу. Подскажите как поступить в случае падения клиента. Надо обработать момент переподключения клиентов(допустим железка обесточивается). Возможно ли опросить список клиентов из lst1, и выкинуть отвалившихся? Как это сделать?
При текущем раскладе, если ребутнуть одну железку 2-3 раза, то список подключений содержит повторяющиеся ip. при первом обращении к которым возникает исключение 10053 и 10054.
5 май 19, 19:39    [21878223]     Ответить | Цитировать Сообщить модератору
 Re: ServerSocket проверка списка активных клиентов.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47373

Валерий666
При текущем раскладе, если ребутнуть одну железку 2-3 раза, то список подключений содержит
повторяющиеся ip. при первом обращении к которым возникает исключение 10053 и 10054.

Это штатное поведение сокетов и ты от него никак не избавишься. В чём проблема?

Posted via ActualForum NNTP Server 1.5

5 май 19, 20:06    [21878234]     Ответить | Цитировать Сообщить модератору
 Re: ServerSocket проверка списка активных клиентов.  [new]
Валерий666
Member

Откуда:
Сообщений: 243
Dimitry Sibiryakov
Валерий666
При текущем раскладе, если ребутнуть одну железку 2-3 раза, то список подключений содержит
повторяющиеся ip. при первом обращении к которым возникает исключение 10053 и 10054.

Это штатное поведение сокетов и ты от него никак не избавишься. В чём проблема?

Проблема в ошибках(исключениях). Представим цикл:
- 1-ое включение устройства - занесение в цикл, отображение в списке. Все ОК.
- Отвал устройства, ребут, реконнект. в списке 2 устройства с одинаковым IP. Попытка опроса\передачи\приема - исключение.
- 2-ое отключение устройства\ ребут. В списке 3 устройства с одинаковым IP. Попытка опроса\передачи\приема - исключение.
и т.д....уже не говоря об 15-ти таких устройствах.
Задача: отсеить "не живые" сессии. чтобы список, на ткущий момент времни был актуален и можно было выделить IP, и послать ему команду(синхронизация\дамп оффлайна).
5 май 19, 23:11    [21878296]     Ответить | Цитировать Сообщить модератору
 Re: ServerSocket проверка списка активных клиентов.  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47373

Валерий666
Проблема в ошибках(исключениях).

Изучай руководство по языку на предмет try-except.

Posted via ActualForum NNTP Server 1.5

5 май 19, 23:24    [21878301]     Ответить | Цитировать Сообщить модератору
 Re: ServerSocket проверка списка активных клиентов.  [new]
ёёёёё
Member

Откуда:
Сообщений: 162
Валерий666,
автор
Задача: отсеить "не живые" сессии. чтобы список, на ткущий момент времни был актуален и можно было выделить IP, и послать ему команду(синхронизация\дамп оффлайна).

Посылай команду всем клиентам, у кого айпи подходящий, в чем проблема? Кто живой, тот отзовётся.

'Актуальность" - понятие субъективное. Вот у меня, например, сервер и клиенты друг другу пинги шлют, каждые х секунд. Если нет пинга от корреспондента в течение у секунд, считаем, что связи нет. Но то у меня, потому что мне нужно именно так. В другой моей приблуде сервер принимает коннекты от всех, не разбирая, но периодически рвет связь и обнуляет список коннектов, не разбирая, кто актуален, а кто нет, а живые клиенты реконнектятся, вот и остаются лишь актуальные. Сам определи, как надо, да сделай.
5 май 19, 23:35    [21878305]     Ответить | Цитировать Сообщить модератору
 Re: ServerSocket проверка списка активных клиентов.  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 3189
Валерий666,

автор
Проблема в ошибках(исключениях).


ислючение, в общем виде - не ошибка. не стоит рассматривать каждое исключение как ошибки. бывает исключение - вполне штатная ситуация. бывает на них логику работы делают.
6 май 19, 10:37    [21878483]     Ответить | Цитировать Сообщить модератору
 Re: ServerSocket проверка списка активных клиентов.  [new]
Валерий666
Member

Откуда:
Сообщений: 243
С этим разобрался.
Как лучше сделать? Держать коннект постоянно и отсылать данные по их наличию (тогда вставет вопрос по idle и таймаутам...) или пойти по принципу - (подключился-отослал-отключился, это со стороны железки). Во втором варианте, не понятно как инициализировать опрос отключенных клиентов. Надо делать каждую точку клиент-сервером (ip статический, проброшен в роутере)?
11 май 19, 18:57    [21882538]     Ответить | Цитировать Сообщить модератору
 Re: ServerSocket проверка списка активных клиентов.  [new]
klon_80
Member

Откуда:
Сообщений: 5
Валерий666
при первом обращении к которым возникает исключение 10053 и 10054.

что мешает обработать эти исключения и на основании их чистить ваш список?

  try
    Client.Connected;  // или как вы там чекаете
  except on E: Exception do
    begin
      LogMemo.Lines.Add(E.Message);
      Client.Disconnect; 
      // <remove ip from list>
    end;
  end;
11 май 19, 21:57    [21882574]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить