Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.21;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.017 c
1-67891
dm37
2003-07-07 12:31
2003.07.21
Hint


14-67992
Nikkk
2003-07-03 19:50
2003.07.21
win-modem в Linux е


14-67962
zolotov
2003-07-01 19:00
2003.07.21
Где можно достать ToolBar c окном настройки кнопок?


1-67868
Пётр
2003-07-08 05:50
2003.07.21
Как сделать недоступными combobox, edit, etc?


7-68100
Poirot
2003-05-04 16:50
2003.07.21
Как программно создать собственный девай, типа как делает subst