Форум: "Сети";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
ВнизSocket Найти похожие ветки
← →
Fixxxer (2003-05-12 00:37) [0]Уважаемые мастера! Пишу программу с использованием сокетов. Когда включаю сервер во время разработки, т.е. совйство ServerSocket.Active сразу ставлю на True, то все работает нормально, но если я это делаю программно при создании формы, вылетает ошибка Asynchronous socket error 10061. Что это значит, и как с этим бороться?
Заранее благодарю.
← →
Digitman (2003-05-12 08:22) [1]
> вылетает ошибка
... connection refused (попытка установления соединения отвержена сервером), возбуждаемая компонентом TClientSocket (!)
1. проверь соответстие св-в Port у компонентов TClientSocket и TServerSocket
2. св-во TServerSocket.Active = True должно быть установлено ДО того, как устанавливается св-во TClientSocket.Active = True
← →
Fixxxer (2003-05-12 10:21) [2]Ошибка происходит в серверном приложении. Клиент тут ни при чем. При запуске сервера в real time и происходит ошибка.
← →
Digitman (2003-05-12 10:50) [3]Да мало ли что у тебя еще делает серверное приложение, кроме работы с объектом TServerSocket ! Может, оно еще и TClientSocket создает)
Однозначно утверждаю - в ходе исполнения строчки
ServerSocket.Active := True такое исключение возникнуть не может ! Это - исключение чисто клиентского компонента, неважно в каком приложении созданного.
трассируй пошагово обработчик OnCreate (в котором. как я понял, строчка эта и находится) и убедись самостоятельно в том, что такого исключения на этой строчке нет !
p.s.
"real time" и "run-time" - сущности абсолютно разные, не путай их. То, о чем ты говоришь, это именно "run-time".
← →
Fixxxer (2003-05-12 11:36) [4]Большое спасибо за помощь. Разобрался. Это действительно ClientSocket выдавал ошибку.
← →
Fixxxer (2003-05-12 11:50) [5]Не могу отловить этот Exception. Пишу так:
try
ClientSocket1.Open;
except
on ESocketError do ShowMessage("connection failed");
end;
При трассировке пошагово это место проходит, доходит до конца и только потом выдает ошибку.
Как с этим бороться?
← →
Digitman (2003-05-12 12:07) [6]либо используй TClientSocket.ClientType = ctBlocking,
либо назначай и обрабатывае его АСИНХРОННОЕ событие OnError()
← →
Fixxxer (2003-05-12 12:33) [7]а можно по-подробнее?
← →
Digitman (2003-05-12 14:44) [8]
> Fixxxer
что поподробнее ?
← →
Fixxxer (2003-05-12 18:38) [9]Как мне обработать асинхронное событие OnError()?
В ней использовать try... except? Да вроде не поможет :/. Выскакивающее сообщение об ошибке не исчезнет.
Если использую TClientSocket.ClientType = ctBlocking, то от сообщения об ошибке вроде избаляюсь, но соединяться не хочет :/
Что мне лучше сделать в этих ситуациях?
← →
Digitman (2003-05-13 09:50) [10]
> Как мне обработать асинхронное событие OnError()?
> В ней использовать try... except? Да вроде не поможет :/.
> Выскакивающее сообщение об ошибке не исчезнет.
хэлп-то иногда читаешь ?) для кого ж он писан Борландом, как не для тебя ?)
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.
отсюда впорле понятно: для того, чтобы "погасить" ошибку , в обработчике события нужно установить
ErrorCode := 0;
кр.сого, в случае если ErrorCode = 10061 (и некоторые другие коды ошибок, связанных с неудачной попыткой коннекта), в том же обработчике следует выполнить
Socket.Close;
> Если использую TClientSocket.ClientType = ctBlocking, то
> от сообщения об ошибке вроде избаляюсь, но соединяться не
> хочет
ты ж ее, вероятно, гасишь в этом случае в блоке except..end !
а "соединяться не хочет" - так ведь и в случае ctNonBlocking у тебя тоже соединение не устанавливается ! По точно той же причине (не знаю пока - какой) ! Режим-то здесь совершенно ни при чем) ... Просто при ctBlocking исключения, возникающие при вызове методов объекта-гнезда, можно перехватывать и обрабатывать непосредственно в блоке except..end, в отличие от ctNonBlocking, при котором исключение должно анализироваться тобой и обрабатываться в процедуре-обработчике события OnError()
← →
Fixxxer (2003-05-13 11:56) [11]Большое спасибо за помощь.
Избавился от ошибки так:
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
ClientSocket1.Close;
end;
← →
Digitman (2003-05-13 12:49) [12]>Избавился от ошибки так:
от одной избавился, другую "заработал")
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close; // разницу прочувствуй !!!!!!
end;
← →
Fixxxer (2003-05-13 16:14) [13]Да-да, точно. Это я в попыхах. :)
Спасибо :)
← →
Fixxxer (2003-05-13 16:20) [14]Ещё способ избавиться от ошибки:
try
try
ClientSocket1.Open
finally
end
except
ShowMessage("Ошибка");
end;
Но при компиляции сообщение об ошибке выскакивает, а в откомпилированном проекте сообщения уже не будет.
← →
Fixxxer (2003-05-13 16:23) [15]А нет. Прошу прощения. В последнем случае сообщение об ошибке будет. Это я не присвоил свойству ClientSockt.Address адрес. Он и не пытался конектиться :)
← →
Digitman (2003-05-13 16:36) [16]
> при компиляции сообщение об ошибке выскакивает
чего-чего ?? какая ошибка может "выскочить" при "компиляции", если ни о каком коннекте речи в этот момент не идет ?
← →
Fixxxer (2003-05-13 21:22) [17]У меня ClientSocket.Open стоит в FormCreate. Из-за этого при компиляции ошибка.
Но я удивляюсь, как можно так сразу выявить ошибку! Digitman, мой искренний поклон тебе.
← →
Palladin (2003-05-14 00:23) [18]в положении поклона оставатся минут 20...
меня бы на такие разьяснения не хватило бы...
← →
Digitman (2003-05-14 08:26) [19]
> Fixxxer
> У меня ClientSocket.Open стоит в FormCreate. Из-за этого
> при компиляции ошибка.
Да ну чушь же ! Мало ли где ClientSocket.Open можно разместить ! При чем здесь компиляция-то ?? Ведь выполнение оператора происходит в run-time, а не в compile-time !
← →
Fixxxer (2003-05-14 12:25) [20]>Digitman
>При чем здесь компиляция-то ??
Да. Ты прав. Всё же между F9 и Ctrl+F9 есть разница.
← →
Digitman (2003-05-14 12:45) [21]
> Fixxxer
Эт точно)
Ctrl-F9 - только компиляция
F9 - компиляция + сборка + запуск
← →
tiam (2003-05-14 16:23) [22]2 digitman
>Избавился от ошибки так:
от одной избавился, другую "заработал")
procedure TForm1.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0;
Socket.Close; // разницу прочувствуй !!!!!!
end;
А в чем разница. Почему именно к сокету?
← →
Digitman (2003-05-14 17:55) [23]
> tiam
в данном частном случае разница невелика, но в общем случае, когда обработчик - один на N объектов класса TClientSocket, параметр Socket: TCustomWinSocket - это именно тот объект, метод Close которого следует вызвать.
← →
Digitman (2003-05-14 17:58) [24]
> tiam
в данном частном случае разница невелика, но в общем случае, когда обработчик - один на N объектов класса TClientSocket, параметр Socket: TCustomWinSocket - это именно тот объект, метод Close которого следует вызвать.
При такой практике (ClientSocket1.Close), дающей не оч.хорошую привычку, рано или поздно это стрельнет ошибкой
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.07.21;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c