![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с повторным соединением
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, но немного попозже.