Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.09.2011, 14:14   #1
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
Вопрос Отсоединение от ServerSocket

Вот есть такие куски кода:
Код:
type
  TServerThread = class( TServerClientThread )
  private
    fSocketStream : TWinSocketStream;
  public
    procedure ClientExecute; override;
  end;

implementation

uses Unit1;

procedure TServerThread.ClientExecute;
var t : string; // temp string
begin
      inherited FreeOnTerminate := TRUE;
      fSocketStream := TWinSocketStream.Create( ClientSocket, 100000 );
      t:=ClientSocket.RemoteAddress;
      with Form1 do
      begin
        ListBox1.Items.Add(t);
        while (not Terminated) and (ClientSocket.Connected) do
        begin
          // waiting for disconnect
        end;
        ShowMessage('Client Disconnected!');
        // deleting from online Listbox
        ShowMessage(IntToStr(ListBox1.Items.IndexOf(t)));
        ListBox1.Items.Delete(ListBox1.Items.IndexOf(t));
      end;
      fSocketStream.Free();
end;
и

Код:
procedure TForm1.Button1Click(Sender: TObject);
begin
      ClientSocket1.Active:=true;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
      ClientSocket1.Close;
end;
Значит, проблема такая. Подсоединяется клиент нормально,сервер это регистрирует. Но вот когда клиент отсоединяется, сервер почему-то ничего не выдаёт и вапше не реагирует на отсоединение. Почему?
_-Re@l-_ вне форума Ответить с цитированием
Старый 24.09.2011, 17:10   #2
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Потому что для сервера он как был connected, так им и остается.
Not connected он станет когда сервер скажет ClientSocket.Close.

Кроме этого в коде есть грубые ошибки.
mss вне форума Ответить с цитированием
Старый 24.09.2011, 18:14   #3
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Потому что для сервера он как был connected, так им и остается.
Not connected он станет когда сервер скажет ClientSocket.Close.
Понял, а как сказать потоку что ClientSocket.Close?
Цитата:
Кроме этого в коде есть грубые ошибки.
Например? Если то, что я не обрабатываю исключения, так не обращайте внимания - их не будет.
_-Re@l-_ вне форума Ответить с цитированием
Старый 25.09.2011, 10:52   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
как сказать потоку что ClientSocket.Close?
Вот прямо так и скажи
Код:
как сказать потоку что ClientSocket.Close?
Цитата:
не обрабатываю исключения..их не будет
Вот как раз они-то обязательно будут при неожиданном закрытии соединения по инициативе партнера.


Цитата:
inherited FreeOnTerminate := TRUE;
Этого делать нельзя.

Цитата:
ShowMessage('
ListBox1.Items.Add
ListBox1.Items.Delete
Этого тоже, причем категорически.
mss вне форума Ответить с цитированием
Старый 25.09.2011, 12:36   #5
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
Этого тоже, причем категорически.
Не согласен. Что плохого в том, что я работаю с ListBox из потока? Тут как раз всё правильно работает. Даже лучше молчите насчёт этого.
Цитата:
Этого делать нельзя.
Ладно, с этим согласен.
Хехе, из потока сделать ClientSocket.Close? Бред какой-то получается - ведь ClientSocket находится на другом компьютере, и отсоединяется он тогда, когда ему нужно, а не когда это нужно серверу.
_-Re@l-_ вне форума Ответить с цитированием
Старый 25.09.2011, 20:49   #6
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

В общем-то говоря, нашёл как решить свою проблему, решил, не очень красиво, но всё-таки.
_-Re@l-_ вне форума Ответить с цитированием
Старый 26.09.2011, 14:45   #7
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

Цитата:
А и проблемы-то не было, ты ж ее из пальца высосал: по факту разрыва соединения с партнером требовалось всего лишь закрыть свой сокет вызовом Close - тогда условие цикла не выполнялось бы и он бы прекращал работу.
Проблема была в том, клиент должен был сам отсоединяться, а не сервер должен был отсоединять его. Вы же мне предлагаете чтобы сервер отсоединял его.
_-Re@l-_ вне форума Ответить с цитированием
Старый 29.09.2011, 20:37   #8
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

На самом деле все гораздо проще. При отсоединении клиента - отправляйте серверу пакет CLOSE и сервер по этой команде сам отсоеденит клиент.
MaTBeu вне форума Ответить с цитированием
Старый 29.09.2011, 20:43   #9
_-Re@l-_
C++, Java
Старожил
 
Аватар для _-Re@l-_
 
Регистрация: 10.04.2010
Сообщений: 2,665
По умолчанию

А вот это уже ближе к делу.
Теперь тогда вопрос. Что есть пакет CLOSE?
_-Re@l-_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ServerSocket MyIE Работа с сетью в Delphi 9 24.06.2010 00:11
Сервер на ServerSocket casper0094 Работа с сетью в Delphi 6 23.06.2010 17:49
Вопрос по ServerSocket prod87 Работа с сетью в Delphi 2 07.06.2010 23:42
Есть ли у IdTCPServer такое свойство как у ServerSocket: ServerSocket.Socket.ActiveConnectio ns? TwiX Работа с сетью в Delphi 3 07.03.2010 14:28
ServerSocket HTL Работа с сетью в Delphi 2 02.01.2010 22:40