powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ServerSocket проверка списка активных клиентов.
8 сообщений из 8, страница 1 из 1
ServerSocket проверка списка активных клиентов.
    #39809960
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть программка сервер, крутиться на компе. Пока в таком виде:
= Текст программки
Код: 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
ServerSocket проверка списка активных клиентов.
    #39809964
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий666При текущем раскладе, если ребутнуть одну железку 2-3 раза, то список подключений содержит
повторяющиеся ip. при первом обращении к которым возникает исключение 10053 и 10054.

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

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

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

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

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

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

ислючение, в общем виде - не ошибка. не стоит рассматривать каждое исключение как ошибки. бывает исключение - вполне штатная ситуация. бывает на них логику работы делают.
...
Рейтинг: 0 / 0
ServerSocket проверка списка активных клиентов.
    #39812095
Валерий666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С этим разобрался.
Как лучше сделать? Держать коннект постоянно и отсылать данные по их наличию (тогда вставет вопрос по idle и таймаутам...) или пойти по принципу - (подключился-отослал-отключился, это со стороны железки). Во втором варианте, не понятно как инициализировать опрос отключенных клиентов. Надо делать каждую точку клиент-сервером (ip статический, проброшен в роутере)?
...
Рейтинг: 0 / 0
ServerSocket проверка списка активных клиентов.
    #39812115
klon_80
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Валерий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
8 сообщений из 8, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ServerSocket проверка списка активных клиентов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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