Текущий архив: 2002.12.26;
Скачать: CL | DM;
ВнизПроблема с повторным соединением Найти похожие ветки
← →
Rob (2002-10-30 17:06) [0]Добрый вечер!
Для соединения использую стандартные компоненты TClientSocket и TServerSocket.
На стороне клиента раз в несколько секунд вызывается по таймеру примерно такая процедура:
if ClientSocket1.Active=False then ClientSocket1.Open;
Это необходимо для того, чтобы определить жив сервер или нет.
Так вот, после нескольких перезапусков сервера (в Win98 примерно 20 раз, в NT/2k/XP примерно 50 раз) приложение-клиент может подсоедиться только после перезагрузки. Ничто другое пока реально не помогло.
Хотелось-бы услышать что-нибудь по сему поводу.
P.S. В onError на стороне клиента прописано:
ClientSocket.Socket.Disconnect(ClientSocket.Socket.SocketHandle);
как и рекомендовано.
← →
Digitman (2002-10-30 17:13) [1]>>приложение-клиент может подсоедиться только после перезагрузки
И что мешает сделать это без перезагрузки ?
← →
Rob (2002-10-30 17:24) [2]Вот и я хотел-бы это прояснить для себя. После указанного числа удачных попыток соединения на стороне клиента упорно вызывается onError. Серверная часть при этом продолжает нормально работать, поскольку другие программы-клиенты, подсоединяющиеся к ней и не исчерпавшие "лимита удачных подключений":) свободно коннектятся.
← →
Digitman (2002-10-30 17:28) [3]onError() - ну так С КАКИМ КОДОМ ОШИБКИ-то ? Он для Пушкина что ли возвращается параметром в этом событии ? Или таки - чтобы ТЫ его проанализировал и определил источник отказа ?
← →
Rob (2002-10-30 17:41) [4]Asynchronous socket error 10061.
В обработчике onError клиентской стороны:
procedure TMainForm.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;// Сейчас заккоментировано:)
ClientSocket1.Socket.Disconnect
ClientSocket1.Socket.SocketHandle);
ClientSocket1.Close;
Panel_conn.Color:=clRed;//Сигнализирует об "обрыве" соединения
end;
← →
Digitman (2002-10-30 17:46) [5]Ну где анализ-то ? параметра ErrorCode ?
← →
Rob (2002-10-30 17:53) [6]Простите, а что подразумевается под анализом? Перевод сообщения об ошибке на русский? Если (как я и подозреваю) нет, то наставьте, пожалуйста на путь истинный.
Суть проблемы в моем понятии кроется именно в том, что она начинает себя проявлять ИМЕННО через примерно одинаковое число попыток.
← →
Digitman (2002-10-30 18:00) [7]Приведи мне значение этого параметра в момент входа в обработчик данного события
← →
Rob (2002-10-30 18:03) [8]Ok, но немного попозже.
← →
Rob (2002-10-31 10:45) [9]Изменил обработчик таким образом:
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.
← →
Digitman (2002-10-31 11:15) [10]Ну и долго ты будешь экспериментировать "вслепую" ?
Вот же хэлп на событие :
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 13:02) [11]ErrorEvent принимает значение eeConnect, если вопрос об этом.
← →
Digitman (2002-10-31 13:21) [12]Уффф-ф-ф-ф !!!!
Еще раз - ErrorCode !!!!!!!
Error (англ. - ошибка) + Code (англ. - код)
Ну что непонятного-то, а ?
Обработчик события есть некая процедура, у этой процедуры среди прочих параметров есть параметр ErrorCode (КОД ОШИБКИ).
Я уже упарился вытягивать из тебя это - ЧЕМУ же РАВНО ЗНАЧЕНИЕ этого самого ПАРАМЕТРА ErrorCode В МОМЕНТ ВЫЗОВА ПРОЦЕДУРЫ, НАЗНАЧЕННОЙ ТОБОЙ В КАЧЕСТВЕ ОБРАБОТЧИКА СОБЫТИЯ OnError() ?
← →
Rob (2002-10-31 14:02) [13]Так я же раньше УЖЕ писАл, что 10061!
"НАЗНАЧЕННОЙ ТОБОЙ В КАЧЕСТВЕ ОБРАБОТЧИКА СОБЫТИЯ OnError()"
НЕ назначал я никакого другого обработчика. Используется стандартная процедура
TMainForm.ClientSocket1Error.....
← →
Digitman (2002-10-31 14:40) [14]
> Так я же раньше УЖЕ писАл, что 10061!
>>ErrorCode:=0;// Сейчас заккоментировано:)
Вот из-за того, что "сейчас заккоментировано", ты и получаешь диалоговое окно с сообщением об ошибке. Каковое ты просто "сдул" и представил как якобы анализ источника ошибки.
Ну так и что ? Конкретно ЭТА ошибка тебе понятна ? Вернее - ее смысл ? Если да - поедем дальше, нет - будем пока разбираться с этой
← →
Rob (2002-10-31 15:12) [15]Да раскомментировал я его!
10061 означает, что: "Удаленный компьютер отказал в соединении, возможно не нём не запущен соответствующая программа сервер."
← →
Digitman (2002-10-31 15:21) [16]Так.
1. Ты хочешь сказать, что это не соответствует действительности в момент, когда при очередной попытке выполнения метода Open() возникает данная ошибка ?
2. На основании чего ты предполагаешь, что в момент сразу же за успешным завершением вызова метода Open() св-во Active сразу же становится True ?
← →
Rob (2002-10-31 15:40) [17]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 16:08) [18]Еще раз спрашиваю :
2. На основании чего ты предполагаешь, что в момент сразу же за успешным завершением вызова метода Open() св-во Active сразу же становится True ?
Хочешь разобраться ? Отвечай четко и внятно на поставленный вопрос ! Я пока не просил тебе приводить код прочих обработчиков событий (хотя уже видно, что некорректен он, но это к "делу о коннекте" не относится)
← →
Rob (2002-10-31 16:22) [19]Open - открытие сокета - аналогично присвоению значения True свойству Active.
Кроме того, по успешному обмену сообщениями программой-клиентом и программой-сервером.
← →
Digitman (2002-10-31 16:51) [20]Ты вопрос понимаешь ?
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 17:09) [21]Теперь понял где начинать копать... Буду пробовать далее. Спасибо.
← →
Digitman (2002-10-31 17:24) [22]
> Rob
Вот и отлично !
Совет : всегда сомневайся в правильности своих представлений о сути происходящего, и да будет истина подвластна тебе !
← →
Rob (2002-10-31 17:37) [23]Привожу процедуру (хотя и не прсили :) ):
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:49) [24]
> сразу после ClientSocket1.Open
Ну с чего ты взял, что "сразу" ? А если сервер на другом конце света находится ? Что, тоже "сразу" ?
У тебя еще предыдущая попытка коннекта не закончилась (она может длиться от долей секунды до, например, 3-х минут), а твой таймер продолжает генерировать очередные события, в которых ОПЯТЬ ты Open() вызываешь.
← →
Victor_Cr (2002-10-31 23:04) [25]Попробуй извратиться с типом клиентского соединения (ctBlocking)
← →
Мазут Береговой (2002-11-01 06:50) [26]Надо ждать пока ClientSocket1.Active станет true примерно так
While not ClientSocket1.Active do Application.ProcessMessages;
Я с этим собаку съел уже... Я там другой, похожий вопрос задал...
← →
Rob (2002-11-01 08:56) [27]Мазут Береговой
Примерно этим путем я и пошел - пока все вроде нормально.
P.S. Млин, ну где ты раньше-то ходил?
Страницы: 1 вся ветка
Текущий архив: 2002.12.26;
Скачать: CL | DM;
Память: 0.51 MB
Время: 0.007 c