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