Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
1 / 1 / 2
Регистрация: 17.09.2013
Сообщений: 67
1

Порты TClientSocket не освобождаются

30.06.2014, 22:38. Показов 1195. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте, пишу две мелкие программы для обемна сообщениями, серверная часть (использует TServerSocket) и клиентская (TClientSocket). Все события вывожу в memo для наглядности.
Заметил что при подключении к серверу клиентский сокет имеет вседа разный порт (у сервера один).

Вот часть лога подключений:

22:12:31 > client connected; Host: ASUS99X.Home (192.168.1.3); Port: 52765
22:12:33 > client ASUS99X.Home disconnected
22:12:33 > client connected; Host: ASUS99X.Home (192.168.1.3); Port: 52767
22:12:34 > client ASUS99X.Home disconnected
22:12:34 > client connected; Host: ASUS99X.Home (192.168.1.3); Port: 52769
22:12:35 > client ASUS99X.Home disconnected
22:12:35 > client connected; Host: ASUS99X.Home (192.168.1.3); Port: 52770
22:12:36 > client ASUS99X.Home disconnected
22:12:36 > client connected; Host: ASUS99X.Home (192.168.1.3); Port: 52775
22:12:36 > client ASUS99X.Home disconnected
22:12:36 > client connected; Host: ASUS99X.Home (192.168.1.3); Port: 52776
22:12:37 > client ASUS99X.Home disconnected
22:12:37 > client connected; Host: ASUS99X.Home (192.168.1.3); Port: 52777
22:12:37 > client ASUS99X.Home disconnected и т.д.

Почему при отключении не освобождаются сокеты? Плохо ли это, и как с этим бороться?

Часть кода серверной части:
Delphi
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
{ ... }
 
procedure TFSrv.FormCreate(Sender: TObject);
var
  namesize: dword;
begin
  namesize := Length(hostname);
  GetComputerName(@hostname, namesize);
  Servak.Active := false;
  Servak.ServerType := stNonBlocking;
  Servak.Port := StrToIntDef(PortEdit.Text, 5050);
  Teamer.Enabled := true;
end;
 
procedure TFSrv.FormShow(Sender: TObject);
begin
  sbClrClick(self);
  sbConnClick(self);
end;
 
procedure TFSrv.sbClrClick(Sender: TObject);
var
  compname: string;
begin
  compname := hostname;
  ServLog.Clear;
  ServLog.SelText := DateToStr(Now) + '. Server host: ' + compname + '; Port: ' +  IntToStr(Servak.Port) + '. Press F1 to Help' + #13#10 + #13#10;
end;
 
procedure TFSrv.sbConnClick(Sender: TObject);
begin
  if Servak.Active = false then
  begin
    Servak.Port := StrToIntDef(PortEdit.Text, 5050);
    Servak.Active := true;
    sbClrClick(self);
  end
  else
    Servak.Active := false;
end;
 
{ ... }
 
procedure TFSrv.ServakClientConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  cbSendTo.Items.Add(Socket.RemoteHost);
  cbSendTo.ItemIndex := cbSendTo.Items.IndexOf(Socket.RemoteHost);
  ServLog.Lines.Add(TimeToStr(Now) + ' > client connected; Host: ' + Socket.RemoteHost +
    ' (' + Socket.RemoteAddress + '); Port: ' + IntToStr(Socket.RemotePort));
end;
 
procedure TFSrv.ServakClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
  item: Integer;
begin
  item := cbSendTo.Items.IndexOf(Socket.RemoteHost);
  cbSendTo.Items.Delete(item);
  ServLog.Lines.Add(TimeToStr(Now) + ' > client ' + Socket.RemoteHost + ' disconnected');
end;
Часть кода клиентской части:

Delphi
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
procedure TForm1.conBtnClick(Sender: TObject);
begin
  if Cleent.Active = false then
  begin
    Cleent.ClientType := ctNonBlocking;
    Cleent.Host := Edit1.Text;
    Cleent.Port := StrToInt(Edit3.Text);
    Cleent.Open;
  end
  else
  begin
    Cleent.Socket.Close;
    Cleent.Close;
  end;
end;
 
procedure TForm1.sendBtnClick(Sender: TObject);
begin
  Cleent.Socket.SendText(Inputmemo.Text);
  Sleep(10);
end;
 
procedure TForm1.CleentConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  ClientLog.Lines.Add(TimeToStr(Now) + ' > Connected to server: ' + Socket.RemoteHost +
    ' (' + Socket.RemoteAddress + '); Port: ' + IntToStr(Socket.RemotePort));
end;
 
procedure TForm1.CleentDisconnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  ClientLog.Lines.Add(TimeToStr(Now) + ' > Disconnected.');
end;
 
procedure TForm1.CleentRead(Sender: TObject; Socket: TCustomWinSocket);
var
  s, tmp: string;
begin
  s := Socket.ReceiveText;
  ClientLog.Lines.Add(TimeToStr(Now) + ' > Message arrived.');
  if s <> '' then
    MessLog.SelText := s + #13#10;
  end;
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2014, 22:38
Ответы с готовыми решениями:

Освобождаются ли ресурсы в данном случае
в событии нажатия кнопки из главной формы создается child форма так: yesNo wDialog = new...

Не освобождаются ресурсы после закрытия Activity
Очередная непонятная проблема. Делаю в активити setContentView() с большим количеством ImageView. В...

Освобождаются ли ресурсы при создании скриншота экрана?
Всем привет, в интернете нашел исходник который позволяет делать скриншот экрана, но вот вопрос:...

При выключении режима игры в редакторе не освобождаются ресурсы
Приветствую. При выключении режима игры в редакторе не освобождаются ресурсы. По событии...

2
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
01.07.2014, 10:35 2
Цитата Сообщение от Zelator Посмотреть сообщение
Почему при отключении не освобождаются сокеты?
Не освобождаться они могут только по одной причине - не вызван метод Socket.Close в обработчике события OnError клиентского сокета при условии неуспешной попытки подключения к серверу.

Цитата Сообщение от Zelator Посмотреть сообщение
Плохо ли это, и как с этим бороться?
То что локальные порты всегда разные - в даннном случае это совершенно нормально и никоим образом не говорит о неосвобождении сокета.

Бороться с этим можно, но не нужно, ибо борьба эта имеет смысл только в ограниченном числе частных случаев, к коим твой случай вряд ли относится.
2
1 / 1 / 2
Регистрация: 17.09.2013
Сообщений: 67
02.07.2014, 22:52  [ТС] 3
ясно, спасибо за инфу
0
02.07.2014, 22:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.07.2014, 22:52
Помогаю со студенческими работами здесь

Закрыть порты на серверном терминале (какие порты в данном случае можно закрыть?)
Имеется серверный терминал,человек сказал что требуется закрыть ВСЕ порты. Понятно что все нельзя...

TServerSocket и TClientSocket
Доброе утро. Есть сервер и, скажем, 3 клиента. ServerSocket-&gt;Socket-&gt;ActiveConnections - список...

TClientSocket и TServerSocket
Не понимаю один вопрос. Например я передаю массив размерностью 4 с одного из этих компонента на...

TClientSocket и TServerSocket
Вопрос в следующем, посылаю в цикле серверу при помощи SendBuf: char temp; FILE * SendStream =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru