Вверх ↑
Этот топик читают: Гость
Разработчик
Ответов: 26163
Рейтинг: 2127
#1: 2007-09-02 02:30:50 ЛС | профиль | цитата
Используя компонент TCP_Server в мультике, я заметил, что при уничтожении мультика по ##clear, и повторном создании мультика по ##add, сокет не работает, так как не закрывается при уничтожении компонента. Немного подправив код мне удалось убрать этот баг, и сокет стал нормально открываться при пересоздании мультика
destructor THITCP_Server.Destroy;
begin
Sock.Close; // это добавлено для закрытия при уничтожении
Sock.OnConnect := nil;
Sock.OnDisconnect := nil;
Sock.OnRead := nil;
Sock.OnClientConnect := nil;
Sock.OnClientDisconnect := nil;
//Sock.Destroy;
inherited;
end;
карма: 22

0
Ответов: 5446
Рейтинг: 323
#2: 2007-09-02 04:56:12 ЛС | профиль | цитата
nesco, а можно вопрос: почему не работало по Destroy? Ибо TCP.pas гласит:


destructor TSocket.Destroy;
begin
Close; //!!!
inherited;
end;
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#3: 2007-09-02 23:49:00 ЛС | профиль | цитата
iarspider, сейчас попробую нарисовать простенький пример и проверить еще раз.

[size=-2]------ Добавлено в 11:23
Вот пример MultiTCP_Servera на два сокета
Последовательность тестирования:
1. По Add создаем MultiServer
2. По Connect подключаемся к серверу
3. Видим информацию подключения в окнах клиентов.
4. Пробуем отключить сервер по Clear, должна в окнах клиентов пропасть информация, но она не пропадает.
5. Нажимаем Disconnect вручную, очищая окна клиентов.
6. Повторяем пункты 1 и 2.
7. В окнах клиентов не появляется ничего.
8. Вносим предложенное исправление в hiTCP_Server.pas.
9. Запускаем и повторяем операции с пункта 1 по пункт 4 -- в окнах клиентов пропадает информация, значит по Clear нормально происходит отсоединение.
10. Пробуем повторить пункты 1 и 2
11. Видим информацию в окнах клиентов. Значит произошло нормальное пересоздание сервера.

[size=-2]------ Добавлено в 12:46
Ну и какие будут предложения по этой теме?

[size=-2]------ Добавлено в 12:50
Выкладываю в обычном формате code_1867.txt

[size=-2]------ Добавлено в 23:49
Странно, но народ молчит. Можно, конечно, повесить очистку на предсмертный цикл перед ##clear, но это добавит несколько компонентов, и неправильно это как-то, на маразм смахивает.
tsdima, вроде ты специалист по сокетам, что скажешь?
карма: 22

0
файлы: 1code_1867.txt [3.4KB] [311]
Гость
Ответов: 17029
Рейтинг: 0
#4: 2007-09-03 19:24:19 правка | ЛС | профиль | цитата


Редактировалось 2 раз(а), последний 2021-05-22 08:22:23
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#5: 2007-09-03 19:35:43 ЛС | профиль | цитата
tsdima, тут похоже на неправильное отрабатыание destructorov. Может Galkov чего подскажет.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#6: 2007-09-03 22:06:10 ЛС | профиль | цитата
Не, по другому, оказывается, нажималось: Add, Add, Close
Чувствуешь, чем пахнет? Дважды Add нельзя.

[size=-2]------ Добавлено в 22:06

Я даже нашёл почему. Вот как надо:
if Sock.Connected then Sock.Listen(10);[/code]

А Sock.Destroy всё-таки не надо комментировать.
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#7: 2007-09-03 22:14:20 ЛС | профиль | цитата
tsdima, но в Sock.Destroy вызывается тот же самый Close и больше ничего. И смысл тогда к нему обращаться, если можно напрямую вызвать Sock.Close?
tsdima писал(а):
С точки зрения программирования, если Sock создали
И кто его создал -- Sock.Create ничего не создавал
constructor TSocket.Create;
begin
inherited;
TimeOut := 100;
end;
Насколько я понял, то сокет создало вот это по _work_doOpen -- Sock.StartServer

[size=-2]------ Добавлено в 22:14
tsdima, и куда воткнуть, что ты написал?
карма: 22

0
Ответов: 2125
Рейтинг: 159
#8: 2007-09-03 22:17:54 ЛС | профиль | цитата
Sock.Create создал объект типа TSocket,
Sock.Destroy его уничтожил.
За собой надо убирать, иначе никакая динамическая чистота у нас не получится.

[size=-2]------ Добавлено в 22:17
Там вроде только в одном месте Listen
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#9: 2007-09-03 22:25:02 ЛС | профиль | цитата
tsdima писал(а):
За собой надо убирать, иначе никакая динамическая чистота у нас не получится

да, я понял. А то мы все про сокеты, вот я про класс и забыл.
Лучше, конечно, поправить на SVN, чтобы у других вопросов не возникало.
карма: 22

0
Ответов: 2125
Рейтинг: 159
#10: 2007-09-03 22:33:42 ЛС | профиль | цитата
Поправил на SVN
карма: 1

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#11: 2007-09-03 22:55:24 ЛС | профиль | цитата
Поправил, проверил, вроде работает. Похоже, еще одна задача решена.

[size=-2]------ Добавлено в 22:55
tsdima, опять компилятор на onError ругается , придется самому дочищать.
карма: 22

0
11
Сообщение
...
Прикрепленные файлы
(файлы не залиты)