Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Socket [D5, Win2k]


Страницы:   1 2

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;

При трассировке пошагово это место проходит, доходит до конца и только потом выдает ошибку.
Как с этим бороться?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо