Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2002.12.26;
Скачать: [xml.tar.bz2];

Вниз

Проблема с повторным соединением   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.65 MB
Время: 0.049 c
14-86168
krotik
2002-12-06 17:16
2002.12.26
Разница между Professional и Enterprise


6-86062
Pithon_kaa
2002-10-31 10:47
2002.12.26
Что рекомендует Borland для использования вместо TServerSocet


1-85936
17.12.2002
2002-12-17 15:54
2002.12.26
HTML


3-85871
Dmitriy
2002-12-09 04:16
2002.12.26
как сохранять пробелы в paradox e


1-86017
Фсщкгі
2002-12-16 14:16
2002.12.26
Дерево :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский