Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ServerSocket проверка списка активных клиентов. / 8 сообщений из 8, страница 1 из 1
05.05.2019, 19:39
    #39809960
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
Есть программка сервер, крутиться на компе. Пока в таком виде:
= Текст программки
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
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.
...
Рейтинг: 0 / 0
05.05.2019, 20:06
    #39809964
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
Валерий666При текущем раскладе, если ребутнуть одну железку 2-3 раза, то список подключений содержит
повторяющиеся ip. при первом обращении к которым возникает исключение 10053 и 10054.

Это штатное поведение сокетов и ты от него никак не избавишься. В чём проблема?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.05.2019, 23:11
    #39809981
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
Dimitry SibiryakovВалерий666При текущем раскладе, если ребутнуть одну железку 2-3 раза, то список подключений содержит
повторяющиеся ip. при первом обращении к которым возникает исключение 10053 и 10054.

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

Проблема в ошибках(исключениях). Представим цикл:
- 1-ое включение устройства - занесение в цикл, отображение в списке. Все ОК.
- Отвал устройства, ребут, реконнект. в списке 2 устройства с одинаковым IP. Попытка опроса\передачи\приема - исключение.
- 2-ое отключение устройства\ ребут. В списке 3 устройства с одинаковым IP. Попытка опроса\передачи\приема - исключение.
и т.д....уже не говоря об 15-ти таких устройствах.
Задача: отсеить "не живые" сессии. чтобы список, на ткущий момент времни был актуален и можно было выделить IP, и послать ему команду(синхронизация\дамп оффлайна).
...
Рейтинг: 0 / 0
05.05.2019, 23:24
    #39809984
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
Валерий666Проблема в ошибках(исключениях).

Изучай руководство по языку на предмет try-except.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
05.05.2019, 23:35
    #39809985
ёёёёё
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
Валерий666,
авторЗадача: отсеить "не живые" сессии. чтобы список, на ткущий момент времни был актуален и можно было выделить IP, и послать ему команду(синхронизация\дамп оффлайна).
Посылай команду всем клиентам, у кого айпи подходящий, в чем проблема? Кто живой, тот отзовётся.

'Актуальность" - понятие субъективное. Вот у меня, например, сервер и клиенты друг другу пинги шлют, каждые х секунд. Если нет пинга от корреспондента в течение у секунд, считаем, что связи нет. Но то у меня, потому что мне нужно именно так. В другой моей приблуде сервер принимает коннекты от всех, не разбирая, но периодически рвет связь и обнуляет список коннектов, не разбирая, кто актуален, а кто нет, а живые клиенты реконнектятся, вот и остаются лишь актуальные. Сам определи, как надо, да сделай.
...
Рейтинг: 0 / 0
06.05.2019, 10:37
    #39810049
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
Валерий666,

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

ислючение, в общем виде - не ошибка. не стоит рассматривать каждое исключение как ошибки. бывает исключение - вполне штатная ситуация. бывает на них логику работы делают.
...
Рейтинг: 0 / 0
11.05.2019, 18:57
    #39812095
Валерий666
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
С этим разобрался.
Как лучше сделать? Держать коннект постоянно и отсылать данные по их наличию (тогда вставет вопрос по idle и таймаутам...) или пойти по принципу - (подключился-отослал-отключился, это со стороны железки). Во втором варианте, не понятно как инициализировать опрос отключенных клиентов. Надо делать каждую точку клиент-сервером (ip статический, проброшен в роутере)?
...
Рейтинг: 0 / 0
11.05.2019, 21:57
    #39812115
klon_80
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ServerSocket проверка списка активных клиентов.
Валерий666при первом обращении к которым возникает исключение 10053 и 10054.
что мешает обработать эти исключения и на основании их чистить ваш список?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
  try
    Client.Connected;  // или как вы там чекаете
  except on E: Exception do
    begin
      LogMemo.Lines.Add(E.Message);
      Client.Disconnect; 
      // <remove ip from list>
    end;
  end;
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ServerSocket проверка списка активных клиентов. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]