Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема с повторным соединением


Страницы:   1 2

Rob ©   (2002-10-30 17:06:00) 

Добрый вечер!
Для соединения использую стандартные компоненты TClientSocket и TServerSocket.
На стороне клиента раз в несколько секунд вызывается по таймеру примерно такая процедура:

if ClientSocket1.Active=False then ClientSocket1.Open;

Это необходимо для того, чтобы определить жив сервер или нет.

Так вот, после нескольких перезапусков сервера (в Win98 примерно 20 раз, в NT/2k/XP примерно 50 раз) приложение-клиент может подсоедиться только после перезагрузки. Ничто другое пока реально не помогло.
Хотелось-бы услышать что-нибудь по сему поводу.

P.S. В onError на стороне клиента прописано:
ClientSocket.Socket.Disconnect(ClientSocket.Socket.SocketHandle);
как и рекомендовано.


Rob   (2002-11-01 08:56:00) [1]

Мазут Береговой
Примерно этим путем я и пошел - пока все вроде нормально.

P.S. Млин, ну где ты раньше-то ходил?


Мазут Береговой   (2002-11-01 06:50:00) [2]

Надо ждать пока ClientSocket1.Active станет true примерно так While not ClientSocket1.Active do Application.ProcessMessages;Я с этим собаку съел уже... Я там другой, похожий вопрос задал...


Victor_Cr   (2002-10-31 23:04:00) [3]

Попробуй извратиться с типом клиентского соединения (ctBlocking)


Digitman   (2002-10-31 17:49:00) [4]


> сразу после ClientSocket1.Open


Ну с чего ты взял, что "сразу" ? А если сервер на другом конце света находится ? Что, тоже "сразу" ?

У тебя еще предыдущая попытка коннекта не закончилась (она может длиться от долей секунды до, например, 3-х минут), а твой таймер продолжает генерировать очередные события, в которых ОПЯТЬ ты Open() вызываешь.


Rob   (2002-10-31 17:37:00) [5]

Привожу процедуру (хотя и не прсили :) ):

procedure TMainForm.ConnectTimerTimer(Sender: TObject);
var ActState: boolean;
begin

if ClientSocket1.Active=false then
begin
try
ClientSocket1.Open; ActState:=ClientSocket1.Active;
except
//.. обработка неуспешного вызова Open();
end;

end;

end;

Так вот, и в случае неактивности серверной части, и в случае глюков сразу после ClientSocket1.Open; вызывается
procedure TMainForm.ClientSocket1Error...


Digitman   (2002-10-31 17:24:00) [6]


> Rob


Вот и отлично !
Совет : всегда сомневайся в правильности своих представлений о сути происходящего, и да будет истина подвластна тебе !


Rob   (2002-10-31 17:09:00) [7]

Теперь понял где начинать копать... Буду пробовать далее. Спасибо.


Digitman   (2002-10-31 16:51:00) [8]

Ты вопрос понимаешь ?

2. На основании чего ты предполагаешь, что в момент сразу же за успешным завершением вызова метода Open() св-во Active сразу жестановится True ?

Хорошо. "На огурцах" уже спрашиваю :

var
ActiveState; Boolean;
try
ClientSocket.Open; // запуск процедуры коннекта
ActiveState := ClientSocket.Active; // результат коннекта ?!
except
.. обработка неуспешного вызова Open()
end;

Почему ты считаешь, что ДАЖЕ ЕСЛИ СЕРВЕР ЗАВЕДОМО ДОСТУПЕН И АКТИВЕН, значение переменной ActiveState в вышеприведенном коде ОБЯЗАТЕЛЬНО будет равно True ? При условии, что ClientSocket.ClientType = ctNonBlocking ? На чем основана такая уверенность ?


Rob   (2002-10-31 16:22:00) [9]

Open - открытие сокета - аналогично присвоению значения True свойству Active.

Кроме того, по успешному обмену сообщениями программой-клиентом и программой-сервером.


Digitman   (2002-10-31 16:08:00) [10]

Еще раз спрашиваю :

2. На основании чего ты предполагаешь, что в момент сразу же за успешным завершением вызова метода Open() св-во Active сразу же становится True ?

Хочешь разобраться ? Отвечай четко и внятно на поставленный вопрос ! Я пока не просил тебе приводить код прочих обработчиков событий (хотя уже видно, что некорректен он, но это к "делу о коннекте" не относится)


Rob   (2002-10-31 15:40:00) [11]

1. Да. Что в сети, что при отладки на локальной машине.
2.
На клиентской стороне: (упрощенно)

procedure TMainForm.ClientSocket1Connect(Sender: TObject;
Socket: TCustomWinSocket);
var S: string;
begin

Panel_conn.Color:=clLime;

S:="Я такой-то";
ClientSocket1.Socket.SendText(S);

end;

На серверной стороне

procedure TMain.ServerSocket1ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
List_events.Items.Add(Socket.RemoteAddress+" Подключение");
end;

procedure TMain.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
begin

List_events.Items.Add(Socket.RemoteAddress+" >сообщение");
List_events.Items.Add(Socket.ReceiveText);

end;

И в таком духе.


Digitman   (2002-10-31 15:21:00) [12]

Так.

1. Ты хочешь сказать, что это не соответствует действительности в момент, когда при очередной попытке выполнения метода Open() возникает данная ошибка ?

2. На основании чего ты предполагаешь, что в момент сразу же за успешным завершением вызова метода Open() св-во Active сразу же становится True ?


Rob   (2002-10-31 15:12:00) [13]

Да раскомментировал я его!
10061 означает, что: "Удаленный компьютер отказал в соединении, возможно не нём не запущен соответствующая программа сервер."


Digitman   (2002-10-31 14:40:00) [14]


> Так я же раньше УЖЕ писАл, что 10061!


>>ErrorCode:=0;// Сейчас заккоментировано:)

Вот из-за того, что "сейчас заккоментировано", ты и получаешь диалоговое окно с сообщением об ошибке. Каковое ты просто "сдул" и представил как якобы анализ источника ошибки.

Ну так и что ? Конкретно ЭТА ошибка тебе понятна ? Вернее - ее смысл ? Если да - поедем дальше, нет - будем пока разбираться с этой


Rob   (2002-10-31 14:02:00) [15]

Так я же раньше УЖЕ писАл, что 10061!

"НАЗНАЧЕННОЙ ТОБОЙ В КАЧЕСТВЕ ОБРАБОТЧИКА СОБЫТИЯ OnError()"

НЕ назначал я никакого другого обработчика. Используется стандартная процедура
TMainForm.ClientSocket1Error.....


Digitman   (2002-10-31 13:21:00) [16]

Уффф-ф-ф-ф !!!!

Еще раз - ErrorCode !!!!!!!
Error (англ. - ошибка) + Code (англ. - код)

Ну что непонятного-то, а ?
Обработчик события есть некая процедура, у этой процедуры среди прочих параметров есть параметр ErrorCode (КОД ОШИБКИ).
Я уже упарился вытягивать из тебя это - ЧЕМУ же РАВНО ЗНАЧЕНИЕ этого самого ПАРАМЕТРА ErrorCode В МОМЕНТ ВЫЗОВА ПРОЦЕДУРЫ, НАЗНАЧЕННОЙ ТОБОЙ В КАЧЕСТВЕ ОБРАБОТЧИКА СОБЫТИЯ OnError() ?


Rob   (2002-10-31 13:02:00) [17]

ErrorEvent принимает значение eeConnect, если вопрос об этом.


Digitman   (2002-10-31 11:15:00) [18]

Ну и долго ты будешь экспериментировать "вслепую" ?

Вот же хэлп на событие :

Occurs when the socket fails in making, using, or shutting down a connection.

property OnError: TSocketErrorEvent;

Description

Write an OnError event handler to respond to errors that arise with the socket connection. Set the ErrorCode parameter to 0 if the OnError event handler successfully deals with the error condition, to prevent an ESocketError from being raised.

Повторяю вопрос, см. <Digitman © (30.10.02 17:28)>


Rob   (2002-10-31 10:45:00) [19]

Изменил обработчик таким образом:

procedure TMainForm.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);

var error_code: integer;
begin
error_code:=GetLastError();
ErrorCode:=0;// Сейчас заккоментировано:)
ClientSocket1.Socket.Disconnect
ClientSocket1.Socket.SocketHandle);
ClientSocket1.Close;
Panel_conn.Color:=clRed;//Сигнализирует об "обрыве" соединения
end;

error_code принимает значение 10035.


Rob   (2002-10-30 18:03:00) [20]

Ok, но немного попозже.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо