Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.53 MB
Время: 0.017 c
7-86195
AlexeyMir
2002-10-24 12:26
2002.12.26
Номера оборудования


3-85791
Hynter
2002-12-06 05:35
2002.12.26
Help! как узнать количество и название таблиц???


1-85925
Nimda
2002-12-17 11:05
2002.12.26
Ne ponal.


3-85865
Larisa
2002-12-08 20:03
2002.12.26
Подскажите пожалуйста, как сделать Back up из приложения.


1-85946
Юз
2002-12-15 14:05
2002.12.26
Список файлов из каталога